シリアルポートに脳を搭載:LLCOM Luaスクリプトデバッグツール

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

シリアルポートに脳を搭載:LLCOM Luaスクリプトデバッグツール

ソース:Modbus China Network(modbus.cn) -中国をリードするModbus通信プロトコル技術コミュニティ

この記事:LLCOM:シリアルポートにLua Brainを取り付ける-Modbusデバッグ効率を倍増させるための完全ガイド·著者:modbus Technical Team·公開日2026- 0 7 - 0 1

LLCOMはGitHubのオープンソースWindowsシリアルデバッグツール(chenxuuu/llcom)で、. NETとTencent xluaエンジンに基づいているため、シリアルデバッグはもはや手動で16進数フレームを発行する必要はありません。そのコアキラーは、標準シリアルツールに基づいて完全なLua 5.3実行環境を組み込み、統合Luat Taskコプログラミングフレームワークをサポートし、自動送受信、Modbus CRCの自動計算、自動ポーリング、自動解析応答の自動解析を書くことができます。インストールからAPIリファレンスまで、4つのModbusスクリプトまで、ダウンロードから自動テストの実行までのすべてのステップをカバーします。キーワード:LLCOM、Luaシリアルデバッグ、Modbus CRC自動計算、シリアルテスト自動化、xlua、Luat Task。


Modbus RTUデバイスをデバッグするための最も一般的なワークフローは、シリアルツールを開く→手動で16進数フレームを入力→ポイント送信→応答を待つ→ 肉眼でバイトを照合→ CRCエラーを検出→再起動です。10台の機器、指の痛み、目の酸味、心のスラグに粉砕された。

LLCOMはこの問題を解決します。これは単なるシリアルアシスタントではなく、スクリプトを実行できるシリアルデバッグエンジンです。


1 LLCOMとは?

LLCOMはGitHubオープンソースプロジェクト(chenxuuu/llcom)で、C#で書かれ、. NETフレームワークに基づいており、Tencent xluaをスクリプトエンジンとして使用している。ライセンスはApache 2.0。

ポジション1:プログラマブルシリアルデバッグツール。通常のシリアルアシスタントは、“キーボードが16進数を打つ→ハンドポイントを送信する→肉眼で16進数を見る”ことができます。LLCOMはLuaスクリプトを書くことができ、データの自動処理、自動送信、自動解析、自動検証を行う。

3つのコア構造:

  • シリアルトランシーバ層:標準シリアルポート通信、ボーレート、データビット、検証ビット構成をサポートし、TCP/UDP/MQTTクライアントとサーバー機能を統合し、他のプログラムが使用するシリアルポートをリッスンすることもできます。
  • LuaスクリプトエンジンレイヤLua 5.3環境+ 合宙 Luat Taskコスケジューリングフレームワーク
  • 送信前処理層ユーザーが送信ボックスに入力したデータは、Luaスクリプト処理後に送信することができます-改行、自動Hex変換、自動JSONアセンブリなど、何でもできます。

オープンソースのアドレスhttps//github.com/chenxuuu/llcom


2.インストールとダウンロード

3つの公式チャンネル、1つを選択:

オプション1:Microsoft StoreWindowsに付属するMicrosoft Storeで“LLCOM”を検索してインストールします。利点は自動更新ですが、欠点はMicrosoftアカウントが必要です。

モード2:ポータブル版(インストール不要)下からzipパッケージをダウンロードし、任意のディレクトリに解凍し、llcom.exeをダブルクリックして実行します。レジストリ、システムディレクトリを書かず、USBドライブに入れてどこでも実行しません。

ステップ3:GitHubリリースhttps://github.com/chenxuuu/llcom/releases/latestから最新の安定版をダウンロードします。特定のバージョンが必要なデバッグシナリオに適しています。

システム要件:Windows 10以降、64ビット。. NET Runtimeが必要です(Windows 10/11には通常組み込まれています。. NET Runtimeが見つからない場合は、Microsoftから. NET Desktop Runtime 8.0をダウンロードしてください)。


第三に、機能リスト:通常のシリアルアシスタントよりも何が多い

LLCOMには、通常のシリアルアシスタントのすべての機能(シリアルポート選択、ボーレート/チェックビット設定、16進/ASCII送受信、ログ表示)に加えて、以下の機能があります。

機能性は説明書はModbusデバッグシナリオ
Lua送信前処理入力ボックスの内容はLuaスクリプト処理後に送信されますCRCの自動スプライシング、スレーブアドレスの自動追加
スタンドアロンLuaスクリプト領域右側にはタイマーとコルーチンを備えた完全なLuaスクリプトがあります。すべてのスレーブレジスタを自動的にポーリングするスクリプトを書く
早送り欄(10ページ×本数無制限)よく使うコマンドを保存、ワンタッチで送信異なるレジスタのフレームを異なるページに読み込む
シリアルモニター他のプログラムが使用しているシリアルデータの監視ソフトウェアがどのようなものか見てください。
TCP/UDP/SSLクライアントとサーバシリアルポート経由でTCPを直接調整できます。Modbus TCPポートのテスト
MQTTテストMQTTパブリッシュ/サブスクライブの統合検証ゲートウェイのMQTTアップリンク
シリアル自動再接続切断後の接続の自動復元機器の電源オフと再起動はデバッグを中断しない
自動ログ保存タイムスタンプ付きシリアルポートとLuaログすべての機器を再起動し、ログを再確認します。
符号化相互変換/文字化け回復GBK/UTF-8/Hex間の変換中国語文字列デバッグ

2つのコア機能の詳細

4.1送信前のLua処理

これはLLCOMの最も簡単な機能です。“送信設定”→“処理スクリプトを送信”でLuaを書き、送信するたびに、入力ボックス内の元のテキストが最初にこのスクリプトに渡され、スクリプト処理後に返された文字列が実際にシリアルポートに送信されたデータです。

3つの古典的な用法

自動追加。rn多くのシリアルデバイスでは、コマンドは改行で終わる必要があります。

return uartData .. "rn"

0D 0 Aを毎回打つ必要はなく、入力コマンドは直接送信されます。

16進の自動変換入力ボックスに16進数の文字列を入力します。010300000001スクリプトは自動的にバイナリに変換されます。

return uartData:fromHex()

これはModbus RTUデバッグの標準です。入力ボックスにModbusフレームの16進数表現を書き込み、スクリプトをバイナリに変換してデバイスに送信します。

JSON自動アセンブリ::インポートa,b,cこれはJSONです-

json = require("JSON")
t = uartData:split(",")
return json:encode({
    key1 = t[1],
    key2 = t[2],
    key3 = t[3],
})

ショートカット送信バーの各ボタンもこのスクリプトを実行するので、10ページのショートカット送信を作成し、各ページに異なるModbusコマンドを設定し、ボタンをクリックするたびに自動的にCRCを追加します。

4.2スタンドアロンLuaスクリプト実行領域

右側には“Luaスクリプト”セクションがあり、完全なLuaプログラムを書いて実行できます。以下のスクリプトはLuat Taskフレームワークのすべての機能を備えています。

  • sys.taskInit()コルーチンタスクの作成
  • sys.wait(ms)遅延待機非ブロッキングインタフェース
  • sys.waitUntil()メッセージの待機(イベント駆動型)
  • sys.timerLoopStart()サイクルタイマー。
  • sys.publish()/sys.subscribe()メッセージパブリッシュサブスクリプション

基本例:シリアルデータ受信後の自動応答--

uartReceive = function (data)
    log.info("uartReceive", data)
    sys.publish("UART", data)
end

sys.taskInit(function()
    while true do
        local _, udata = sys.waitUntil("UART")
        log.info("task waitUntil", udata)
        local sendResult = apiSendUartData("ok!")
        log.info("uart send", sendResult)
    end
end)

xluaを使用して直接C#のSystem. Netライブラリを呼び出すこともできます。つまり、シリアルポートがデータを受信した後、自動的にクラウドプラットフォームにメッセージをプッシュするスクリプトを記述できます。


5.コアAPIの高速化

LLCOMのLua APIドキュメントはhttps://github.com/chenxuuu/llcom/blob/master/LuaApi.mdにあり、Modbusデバッグの最も一般的な部分をリストしています。

5.1シリアル送受信API

シリアルポートへのデータ送信(新しいインターフェース推奨)
apiSend uart"data

シリアルポートにデータを送信する(古いインターフェイス、後で削除)
apiSendUartData data

--シリアル受信コールバックを購読する
apiSetCb“uart”function data
    log.info "received" data
end nParticle

--購読解除
apiUnsetCb“uart”、callback

5.2タイマーとコルーチンAPI

- タスクの作成
sys.taskInit function
    while true doとは
        あなたの論理。
        sys.wait 1000--等 1000ms
    End of Endシングル
end nParticle

サイクルタイマーを使用。
sys.timerLoopStart function
    log.info "tick" os.time
end 1000--1000msごとにされます。

- タイマーを停止する。
sys.timerStop timerId

5.3文字列処理API

--2进数から16进数文字列
string.toHex "x01x03"--"0103"を返します

--16進文字列からバイナリへ
"01030000001"

--文字列の分割
"a

5.4ログAPI

log.info("tag", "message")
log.warn("tag", "warning")
log.error("tag", "error")

すべてのログは自動的にソフトウェアディレクトリにタイムスタンプ付きで保存されます。


6. Modbus RTUスクリプト

以下のスクリプトはLLCOMに直接コピーできます。それぞれが完全に利用可能です。

6.1スマート送信:Modbus CRCを自動的に計算して送信

手動CRCの疲れた?これはModbusデバッグにおけるLLCOMの最も古典的なアプリケーションである。

“処理スクリプトを送信”に貼り付けます。

Modbus CRC16ルックアップテーブル法(多項式0 x A 001)
local crcTable = {}
for i = 0,255 do
    ローカルCRC = I
    for _ = 1,8 do
        if crc 1 ~= 0 then
            crc = crc1 ~ 0xA001
        elseさん
            CRC = CRC 1
        End of Endシングル
    End of Endシングル
    crcTable i] = crc
End of Endシングル

local function modbusCrc16 data
    local crc = 0 x FFFF
    for i = 1 #data do
        local b = string.byte data i
        crc = crc8 ~ crcTable crc ~ b 0xFF]
    End of Endシングル
    CRCに戻る
End of Endシングル

メインロジック:入力をバイナリに変換し、CRCを計算し、スペルアップし、シリアルポートに送信します。
local raw = uartData fromHex--入力ボックスには16進数010300000001などを書き込む
local crc = modbusCrc16(raw)
local lo = crc 0 xFF
local hi = crc 8 0xFF
Return raw.. string.lo hi

入力ボックスに書き込みます。010300000001(スレーブアドレス=01,関数コード=03,開始アドレス=0000,レジスタ数= 00 01),ドット送信後に実際に送信されるのは01 03 00 00 00 01 84 0ACRCは自動的に後方に接続します。

6.2 Modbus RTU自動ポーリングスクリプト

“Luaスクリプト”領域で実行し、ステーション01の保持レジスタ40001(アドレス0 x 0000)を2 秒ごとに読み取り、返されたデータを自動的に解析します。

-CRCテーブル(上記、省略、スクリプトの先頭に置く必要があります)
-- ...(6.1のcrcTableとmodbusCrc16関数と同じ)

local function buildReadslave Addr reg
    local frame = string.char slave 0x03
        startAddr 8
        regCount 8
    local crc = modbusCrc16
    return frame.. string.char crc 0xFF crc 8 0xFF
End of Endシングル

local function parsedata
    #data 5の場合
        log.warn "modbus"、"応答が短すぎます" .. string.toHex data
        リターン·ニール
    End of Endシングル
    local slave = string.byte data 1
    local c = string.byte data 2
    func 0 x 80の場合
        log.error "modbus"、"例外コード0x" .. string.format " % 02X" string.byte data 3
        リターン·ニール
    End of Endシングル
    local be = string.byte data 3
    ローカル値= {}
    for i = 0 be/ 2 - 1 do
        local hi = string.byte data 4 + i * 2
        local lo = string.byte data 5 + i * 2
        values[ i + 1] = hi<< 8|ロ·ロ
    End of Endシングル
    return {slave = slave values = values}
End of Endシングル

- 受信処理。
apiSetCb“uart”function data
    local result = parseResponse data
    結果が出た場合
        log.info "modbus" string.format "スレーブ% 02Xレジスタ値%s"
            result.slave table.concat result.values ""
    End of Endシングル
end nParticle

- ポーリング·タスク
sys.taskInit function
    while true doとは
        local frame = buildReadFrame 0x01 0x0000 4
        log.info "mod"、"送信".. string。toHex(frame))
        apiSend("uart", frame)
        sys.wait(2000)
    end
end)

実行後のログ出力は次のようになります。modbus送信0103000000044409→modbusスレーブ01レジスタ値168 2234 0 512。手動の介入なし、スクリプトは自動的にポーリング、自動解析、自動ログを作成します。

6.3ステーションスキャナーの詳細

バス上のどのスレーブステーションがオンラインかを自動スキャンします。すべてのコマンドを読み取り、応答はオンラインです:

--CRC関数上記、省略

local function scanSlave slaveId
    local frame = string.char slaveId 0x03 0x00 0x00 0x01
    local crc = modbusCrc16
    frame = frame.. string.char crc 0xFF crc 8 0xFF

    apiSetCb“uart”function data
        if #data = 5 and string.byte data 1 == slId
            and string.byte data 2 == 0x03 then
            log.info“scan”、“ステーションから”。slId..“オンライン✓”
        End of Endシングル
    end nParticle

    apiSend“uart”、frame
    log.info“scan”、“scanスレーブ”。。slId.. " ... ")
End of Endシングル

sys.taskInit function
    for slId = 1,247 do
        scanSlave slaveId
        sys.wait(150)-スレーブの応答時間を150ms待つ
    End of Endシングル
    log.info“scan”、“スキャン完了”
end nParticle

スクリプトが実行されると、ログはすべてのオンラインスレーブアドレスをリストします。大規模なプロジェクトで初めて電源を入れた後、マニュアルを読む手間を省くためにこれを実行します。

6.4応答フレーム自動解析 +データエクスポート

Modbusレスポンスを受信すると、自動的に解析されCSV 行にフォーマットされ、傾向分析のためにExcelに簡単にコピーできます。

ローカル結果= {}

apiSetCb“uart”function data
    #data 5が終了したら
    local slave = string.byte data 1
    local c = string.byte data 2
    func = 0 x 80ならば
        log.error "modbus" string.format "S= % 02X異常コード0x % 02X" slave string.byte data 3
        Return To Returnシングル
    End of Endシングル
    local be = string.byte data 3
    local row = {os.date "%H %M %S" slave}
    for i = 0 be/ 2 - 1 do
        local hi = string.byte data 4 + i * 2
        local lo = string.byte data 5 + i * 2
        table.insert row<< hi8| lo
    End of Endシングル
    table.insert results table.concat row ""
    log.info "csv" table.concat row "
end nParticle

ポーリングタスク(5 秒ごとに取得、合計60回取得= 5分)
sys.taskInit function
    I = 1,60の場合
        local frame = string.char 0x01 0x03 0x00 0x00 0x04
        local crc = modbusCrc16
        apiSend "uart" frame.. string.char crc 0xFF crc 8 0xFF
        sys.wait 5000
    End of Endシングル
    log.info "export"、"採取完了、合計" .. #results...“行”
end nParticle

ログ出力の各行は、Excelで開くCSVファイルに直接コピー &ペーストできます。


TCP / MQTT /リスニング-その他のModbusシナリオ

7.1 Modbus TCPの調整

LLCOMはModbus TCPデバイス(デフォルトポート502)に接続するTCPクライアントとして機能します。TCPクライアント機能を開き、デバイスIPとポート502を入力し、接続後にシリアルポートのように送受信します。 Modbus TCPフレームとRTUフレームの違いは、CRCが少なく、MBAPヘッダ(6バイト)が多いことです。送信処理スクリプトでMBAPヘッダを自動的に追加できます。

--入力ボックスは0000000000000060103000000001と書く
--トランザクションID=0000、プロトコルID=0000、長さ=0006、セルID=01、機能コード=03、開始アドレス=0000、レジスタ数=0001を表す。
return uartData fHex

または、スクリプトはシリアルポート受信RTUフレームを受信し、CRCを削除してMBAPヘッダに置き換え、TCPチャネルを介して送信します。ソフトウェア固有のものを見るchannel-demo.lua例です。

7.2 MQTTテスト

Modbusゲートウェイをデバッグする場合(DTUはシリアルデータをMQTTパブリッシュに変換します)、LLCOMのMQTT機能はゲートウェイがパブリッシュしたトピックを直接購読し、ゲートウェイが送信したデータが正しいかどうかを確認できます。制御トピックにメッセージを送信するテストもできます。

7.3シリアルモニター

シリアルモニタリング機能は、他のソフトウェアが使用しているシリアル通信をキャプチャします。たとえば、ホストコンピュータソフトウェアがデバイスと通信している場合、停止したくないが、送信されたフレームを見たい場合などです。LLCOMは、元の通信に影響を与えずにシリアルデータをサイレントに取得してログを表示できます。


VIII.類似ツールとの比較

ツール·ツールスクリプトのサポートModbus CRCオープンソースソース価格は
LLCOMLua 5.3 + xlua +コルーチンフレームワーク自分で書く必要があります(この記事は提供済み)はい。無料です。
SSCOMなしなし。サポートなし。いいえ、いいえ無料です。
COMTool制限付き。サポートなし。はい。無料です。
Modbus Pollなし(プロフェッショナルModbus 固定機能)組み込み型いいえ、いいえ$129
ModScanなしなし。組み込み型いいえ、いいえ$69

LLCOMは“すぐに使える”Modbus専用のツールではなく、“Modbus専用のツールになる万能ツール”です。ボタンをクリックするだけでModbusフレームを送信する場合は、Modbus Pollの方が簡単です。しかし、バッチ自動テスト、カスタム解析、データエクスポート、MQTT/TCPとのチューニングが必要な場合は、LLCOMはオープンソースツールの中で最も柔軟です。


IX.よくある質問

Q文字化けしたら?ボーレートとベリファイビットがデバイスと一致しているかどうかを確認します。次に、LLCOMの受信領域でHexディスプレイを切り替えます。デバイスはバイナリデータを返すが、表示領域はASCIIで解析されるため、多くの場合“文字化け”します。

Q CRCスクリプトから送信されたフレームデバイスが応答しませんか。ステップ1:A/Bラインが接続されていないことを確認します。ステップ2:受信エリアでデバイスがバイトを返しているかどうかを確認します。まったくない場合は、デバイスアドレスが間違っている可能性があります。ステップ3:デバイスがデータを返したが例外コード(関数コード+0 x 80)の場合、例外コードが何であるかを確認します。0 x 0 2は“不正なデータアドレス”であり、レジスタアドレスが存在しない可能性があります。

Qショートカット送信バーのボタンは自動的にCRCスクリプトを実行できますか?できます。ショートカット送信バーの内容も“送信処理スクリプト”を通過するため、CRC自動計算スクリプトを書いた後、ショートカット送信バーは裸のフレームを埋めるだけで済みます。010300000001ボタンは自動的にCRCを追加します。

Q Luaスクリプトの実行時報は間違っていますか?スクリプト領域の先頭に行を追加log.info("boot", "script started")スクリプトが正常に起動するか確認する。ほとんどのエラーは、変数名のスペルミスや存在しないAPIの呼び出しによるものです。ログ領域にLuaエラーメッセージが表示されます。


LLCOMのコアバリューは、機能を追加することではなく、“デバッグ”を反復的な手作業からプログラム可能なタスクに変えることです。30分ほど現場で3つのスクリプトを書き、次の3日間でマウスのデータを数回タップするだけで自分で作成できます。これが“シリアルポートに頭脳を入れる”という本当の意味です。LLCOMにはAIがあるのではなく、LLCOMでは独自のデバッグロジックをコードに記述し、ソフトウェアを実行させることができます。

再び話す問題がある。

この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注