ソース: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”、callback5.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 timerId5.3文字列処理API
--2进数から16进数文字列
string.toHex "x01x03"--"0103"を返します
--16進文字列からバイナリへ
"01030000001"
--文字列の分割
"a5.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 | オープンソースソース | 価格は |
|---|---|---|---|---|
| LLCOM | Lua 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では独自のデバッグロジックをコードに記述し、ソフトウェアを実行させることができます。
再び話す問題がある。
发表回复