- 1. 一、LLCOM Was ist das?
- 2. 二、安装与Download
- 3. 三、Funktion清单:比普通Die SerieAssistenten.多了什么
- 4. 四、两大核心Funktion详解
- 5. 4.1 Senden Sie前 Lua 处理
- 6. 4.2 独立 Lua DrehbuchBetrieb区
- 7. 五、核心 API 速查
- 8. 5.1 Die Serie收发 API
- 9. 5.2 定时器与协程 API
- 10. 5.3 Charaktere串处理 API
- 11. 5.4 日志 API
- 12. 六、Modbus RTU 实战Drehbuch
- 13. 6.1 智能Senden Sie:自动Berechnung Modbus CRC 并Senden Sie
- 14. 6.2 Modbus RTU 自动轮询Drehbuch
- 15. 6.3 多Von der Station扫描器
- 16. 6.4 Antwort帧自动Analyse + DatenExportieren
- 17. 七、TCP / MQTT / 监听 —— 其他 Modbus Szene
- 18. 7.1 调 Modbus TCP
- 19. 7.2 MQTT 测试
- 20. 7.3 Die Serie监听
- 21. 八、和同类Werkzeuge的对比
- 22. 九、Häufige Fragen
- 23. 给Die Serie装上大脑:LLCOM LuaDrehbuchDebugging-Tools
Quelle:Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft
本文:LLCOM:给Die Serie装上 Lua 大脑 —— Modbus Tests效率翻倍的vollständig指南 · Der Autor:Technisches Team von Modbus · 发布于 2026-07-01
摘要:LLCOM 是 GitHub 开源的 Windows Die SerieDebugging-Tools(chenxuuu/llcom),基于 .NET 和腾讯 xlua 引擎,让Serien-Test不再是手动一条条发16. System帧。其核心杀手锏是在标准Die SerieWerkzeuge基础上内嵌了vollständig的 Lua 5.3 Betrieb环境,支持合宙 Luat Task 协程框架,可以写Drehbuch自动收发、自动Berechnung Modbus CRC、自动轮询、自动AnalyseAntwort。本文从安装zu API 参考zu四个 Modbus 实战Drehbuch,覆盖你从Downloadzu跑通自动化测试的每一个步骤。关键词:LLCOM、Lua Serien-Test、Modbus CRC 自动Berechnung、Die Serie自动化测试、xlua、Luat Task。
Tests Modbus RTU Ausrüstung最Häufig的工作流是:Öffnen Sie die Serie.Werkzeuge → manuell importiert.16. System帧 → 点Senden Sie → 等回应 → 肉眼对照Bytes → 发现 CRC 算错了 → 重新来。十台Ausrüstung调完,手指痛、眼睛酸、心里碎成渣。
LLCOM 解决的就是这个问题。它不只是一个Die SerieAssistenten.——它是个能跑Drehbuch的Serien-Test引擎。
一、LLCOM Was ist das?
LLCOM 是 GitHub 开源项目(chenxuuu/llcom),用 C# 写、基于 .NET 框架,采用腾讯 xlua 作为Drehbuch引擎。Lizenz是 Apache 2.0。
定位一句话:可编程的Die SerieDebugging-Tools。普通的Die SerieAssistenten.只能「键盘打16. System→手点Senden Sie→肉眼看出16. System」。LLCOM 可以写 Lua Drehbuch让Daten自动处理、自动Senden Sie、自动Analyse、自动Prüfungen。
核心架构三层:
- Die Serie收发层:标准Serielle Kommunikation,支持Porter Rate、Datenplatz、Prüfstand.配置,同时集成 TCP/UDP/MQTT 客户端和Der ServerFunktion,还能监听其他程序使用的Die Serie
- Lua Drehbuch引擎层:Lua 5.3 环境 + 合宙 Luat Task 协程框架(sys.wait、sys.taskInit、sys.timerLoopStart 等Alles移植)
- Senden Sie前处理层:用户在Senden Sie框中输入的Daten,可以经过一段 Lua Drehbuch处理后再发出去——自动换行、自动转 Hex、自动组装 JSON,什么都能干
开源Adresse:https://github.com/chenxuuu/llcom
二、安装与Download
三个官方渠道,选一个:
方式一:微软商店 在 Windows 自带的 Microsoft Store 中Suche nach「LLCOM」即可安装。优势是自动更新,缺点是需要微软账Nr.。
方式二:便携版(免安装) 从 底部 Download zip 包,解压zu任意目录,双击 llcom.exe Betrieb。不上Registrierung表、不写Das System目录,放zu U 盘里zu处带着跑。
方式三:GitHub Releases 从 https://github.com/chenxuuu/llcom/releases/latest Download最新稳定版。适合需要特定版本的TestsSzene。
Das System要求:Windows 10 及以上,64 位。需要 .NET Runtime(Windows 10/11 通常已内置;如果提示缺少 .NET Runtime,从微软官网Download .NET Desktop Runtime 8.0 即可)。
三、Funktion清单:比普通Die SerieAssistenten.多了什么
LLCOM 有普通Die SerieAssistenten.的所有Funktion(Die SerieAuswahl、Porter Rate/Prüfstand.配置、16. System/ASCII 收发、日志显示),然后加了这些:
| Funktion | 说明 | Modbus TestsSzene |
|---|---|---|
| Lua Senden Sie前处理 | 输入框内容经过 Lua Drehbuch处理后才Senden Sie | 自动拼接 CRC、自动加von der Station Adresse |
| 独立 Lua Drehbuch区 | 右侧可跑vollständig的 Lua Drehbuch,带定时器和协程 | 写一个Drehbuch自动轮询所有Von der StationRegister. |
| 快捷Senden Sie栏(10 页×不限条数) | 保存常用Befehl,一键Senden Sie | 把读不同Register.的帧放不同页 |
| Die Serie监听 | 监控其他程序正在使用的Seriöse Daten | 看某上位机软件发了什么帧 |
| TCP/UDP/SSL 客户端和服务端 | 可以不通过Die Serie直接调 TCP | 测试 Modbus Der TCP-Port |
| MQTT 测试 | 集成 MQTT 发布/订阅 | 验证网关的 MQTT 上行 |
| Die Serie自动重连 | 断开后自动恢复Verbindung | Ausrüstung断电重启不会断Tests |
| 自动日志保存 | 带Zeit戳的Die Serie和 Lua 日志 | 调完AllesAusrüstung,回头看日志复盘 |
| Codierung互转/乱码恢复 | GBK/UTF-8/Hex 之间转换 | 中文Charaktere串Tests |
四、两大核心Funktion详解
4.1 Senden Sie前 Lua 处理
这是 LLCOM 最直接提效的Funktion。在「Senden Sie设置」→「Senden Sie处理Drehbuch」里写一段 Lua,每次点Senden Sie时,你输入框里的原始Text先传给这段Drehbuch,Drehbuch处理后返回的Charaktere串才是真正发zuDie Serie的Daten。
三个经典用法:
自动加 rn:很多Serielle Ausrüstung要求Befehl以回车换行结尾——
return uartData .. "rn"
从此不用每次手打 0D 0A,输入Befehl直接点Senden Sie就完事。
16. System自动转换:在输入框里写16. SystemCharaktere串(如 010300000001),Drehbuch自动转成Binärsystem——
return uartData:fromHex()
这是 Modbus RTU Tests的标配——你在输入框写 Modbus 帧的16. System表示,Drehbuch转成Binärsystem发给Ausrüstung。
JSON 自动组装:输入 a,b,c,发出去的是 JSON——
json = require("JSON")
t = uartData:split(",")
return json:encode({
key1 = t[1],
key2 = t[2],
key3 = t[3],
})
快捷Senden Sie栏的每个Knopf也同样走这个Drehbuch,所以你可以建 10 页快捷Senden Sie,每页放不同的 Modbus Befehl,然后每次点Knopf自动加 CRC 发出去——后面会给出vollständig实现。
4.2 独立 Lua DrehbuchBetrieb区
右边有个「Lua Drehbuch」区域,你可以直接写vollständig的 Lua 程序并Betrieb。这里的Drehbuch拥有合宙 Luat Task 框架的Alles能力:
sys.taskInit()创建协程任务sys.wait(ms)延时等待(不阻塞界面)sys.waitUntil()等待消息(Ereignisse驱动)sys.timerLoopStart()循环定时器sys.publish()/sys.subscribe()消息发布订阅
基础Beispiel:收zuSeriöse Daten后自动回复——
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 类库发 HTTP Bitte——这意味着你可以写一个Drehbuch,Die Serie收zuDaten后自动往Cloud-Plattform推一条消息。
五、核心 API 速查
LLCOM 的 Lua API Dokumentation位于 https://github.com/chenxuuu/llcom/blob/master/LuaApi.md ,这里列出 Modbus Testsam häufigsten verwendet的部Unterteilung。
5.1 Die Serie收发 API
-- Senden SieDatenzuDie Serie(推荐新Schnittstelle)
apiSend("uart", data)
-- Senden SieDatenzuDie Serie(旧Schnittstelle,后续会Entfernen)
apiSendUartData(data)
-- 订阅Die SerieEmpfang回调
apiSetCb("uart", function(data)
log.info("received", data)
end)
-- Absage订阅
apiUnsetCb("uart", callback)
5.2 定时器与协程 API
-- 创建任务
sys.taskInit(function()
while true do
-- 你的逻辑
sys.wait(1000) -- 等 1000ms
end
end)
-- 循环定时器
sys.timerLoopStart(function()
log.info("tick", os.time())
end, 1000) -- 每 1000ms 触发一次
-- Stopp!定时器
sys.timerStop(timerId)
5.3 Charaktere串处理 API
-- Binärsystem转16. SystemCharaktere串
string.toHex("x01x03") -- 返回 "0103"
-- 16. SystemCharaktere串转Binärsystem
("010300000001"):fromHex()
-- Unterteilung割Charaktere串
("a,b,c"):split(",") -- 返回 {"a","b","c"}
5.4 日志 API
log.info("tag", "message")
log.warn("tag", "warning")
log.error("tag", "error")
所有日志自动保存zu软件目录,并附带Zeit戳。
六、Modbus RTU 实战Drehbuch
以下Drehbuch可以直接Kopieren.zu LLCOM 里Betrieb。每个都是vollständig可用的。
6.1 智能Senden Sie:自动Berechnung Modbus CRC 并Senden Sie
Tired of 手动算 CRC?这是 LLCOM 在 Modbus Tests中最经典的应用。
在「Senden Sie处理Drehbuch」中粘贴:
-- Modbus CRC16 查表法(多项式 0xA001)
local crcTable = {}
for i = 0, 255 do
local crc = i
for _ = 1, 8 do
if (crc & 1) ~= 0 then
crc = (crc >> 1) ~ 0xA001
else
crc = crc >> 1
end
end
crcTable[i] = crc
end
local function modbusCrc16(data)
local crc = 0xFFFF
for i = 1, #data do
local b = string.byte(data, i)
crc = (crc >> 8) ~ crcTable[(crc ~ b) & 0xFF]
end
return crc
end
-- 主逻辑:把输入转成Binärsystem,Berechnung CRC,拼上去,发给Die Serie
local raw = uartData:fromHex() -- 输入框写16. System,如 010300000001
local crc = modbusCrc16(raw)
local lo = crc & 0xFF
local hi = (crc >> 8) & 0xFF
return raw .. string.char(lo, hi)
现在你在输入框写 010300000001(von der Station Adresse=01,Funktionscode=03,Ausgang Adresse=0000,Register.数=0001),点Senden Sie后实际发出去的是 01 03 00 00 00 01 84 0A——CRC 自动接在后面。
6.2 Modbus RTU 自动轮询Drehbuch
跑在「Lua Drehbuch」区域中,每隔 2 秒读一次Von der Station 01 的保持Register. 40001(Adresse 0x0000),自动Analyse返回Daten:
-- CRC 表(同上,这里省略,需要放在Drehbuch最前面)
-- ...(和 6.1 的 crcTable 和 modbusCrc16 函数一样)
local function buildReadFrame(slave, startAddr, regCount)
local frame = string.char(slave, 0x03,
(startAddr >> 8) & 0xFF, startAddr & 0xFF,
(regCount >> 8) & 0xFF, regCount & 0xFF)
local crc = modbusCrc16(frame)
return frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)
end
local function parseResponse(data)
if #data < 5 then
log.warn("modbus", "Antwort太短: " .. string.toHex(data))
return nil
end
local slave = string.byte(data, 1)
local func = string.byte(data, 2)
if func > 0x80 then
log.error("modbus", "Ungewöhnlicher Code: 0x" .. string.format("%02X", string.byte(data, 3)))
return nil
end
local byteCount = string.byte(data, 3)
local values = {}
for i = 0, (byteCount / 2) - 1 do
local hi = string.byte(data, 4 + i * 2)
local lo = string.byte(data, 5 + i * 2)
values[i + 1] = (hi << 8) | lo
end
return {slave = slave, values = values}
end
-- Empfang处理
apiSetCb("uart", function(data)
local result = parseResponse(data)
if result then
log.info("modbus", string.format("Von der Station%02X Registerwert: %s",
result.slave, table.concat(result.values, ", ")))
end
end)
-- 轮询任务
sys.taskInit(function()
while true do
local frame = buildReadFrame(0x01, 0x0000, 4)
log.info("modbus", "Senden Sie: " .. string.toHex(frame))
apiSend("uart", frame)
sys.wait(2000)
end
end)
Betrieb后日志输出类似:modbus Senden Sie: 0103000000044409 → modbus Von der Station01 Registerwert: 168, 2234, 0, 512。不需要人工干预,Drehbuch自动轮询、自动Analyse、自动打日志。
6.3 多Von der Station扫描器
自动扫描总线上有哪些Von der Station在线。挨个发LesenBefehl,有Antwort的就是在线:
-- CRC 函数同上,省略
local function scanSlave(slaveId)
local frame = string.char(slaveId, 0x03, 0x00, 0x00, 0x00, 0x01)
local crc = modbusCrc16(frame)
frame = frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)
apiSetCb("uart", function(data)
if #data >= 5 and string.byte(data, 1) == slaveId
and string.byte(data, 2) == 0x03 then
log.info("scan", "Von der Station " .. slaveId .. " 在线✓")
end
end)
apiSend("uart", frame)
log.info("scan", "扫描Von der Station " .. slaveId .. " ...")
end
sys.taskInit(function()
for slaveId = 1, 247 do
scanSlave(slaveId)
sys.wait(150) -- 等 150ms 给Von der StationAntwortZeit
end
log.info("scan", "扫描abgeschlossen.")
end)
Drehbuch跑完,日志里列出所有在线的von der Station Adresse。大型项目中Die一次上电后跑一遍这个,省去挨个看说明书的功夫。
6.4 Antwort帧自动Analyse + DatenExportieren
收zu Modbus Antwort后,自动Analyse并Das Format化为 CSV 行,方便Kopieren.zu Excel 做趋势Unterteilung析:
local results = {}
apiSetCb("uart", function(data)
if #data < 5 then return end
local slave = string.byte(data, 1)
local func = string.byte(data, 2)
if func >= 0x80 then
log.error("modbus", string.format("S=%02X Ungewöhnlicher Code0x%02X", slave, string.byte(data, 3)))
return
end
local byteCount = string.byte(data, 3)
local row = {os.date("%H:%M:%S"), slave}
for i = 0, (byteCount / 2) - 1 do
local hi = string.byte(data, 4 + i * 2)
local lo = string.byte(data, 5 + i * 2)
table.insert(row, (hi << 8) | lo)
end
table.insert(results, table.concat(row, ","))
log.info("csv", table.concat(row, ","))
end)
-- 轮询任务(每 5 秒采集一次,共采集 60 次 = 5 Unterteilung钟)
sys.taskInit(function()
for i = 1, 60 do
local frame = string.char(0x01, 0x03, 0x00, 0x00, 0x00, 0x04)
local crc = modbusCrc16(frame)
apiSend("uart", frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF))
sys.wait(5000)
end
log.info("export", "采集abgeschlossen.,共 " .. #results .. " 行")
end)
日志输出的每一行都可以直接Kopieren.粘贴zu CSV 文件里用 Excel Öffnen.。
七、TCP / MQTT / 监听 —— 其他 Modbus Szene
7.1 调 Modbus TCP
LLCOM 可以当 TCP 客户端Verbindung Modbus TCP Ausrüstung(默认端口 502)。Öffnen. TCP 客户端Funktion,填入Ausrüstung IP 和端口 502,Verbindung成功后像Die Serie一样收发—— Modbus TCP 帧和 RTU 帧的区别只是少了 CRC、多了 MBAP 头(6 Bytes)。你可以在Senden Sie处理Drehbuch里自动补上 MBAP 头:
-- 输入框写 000000000006010300000001
-- 表示:事务ID=0000,VereinbarungID=0000,Länge=0006,单元ID=01,Funktionscode=03,Ausgang Adresse=0000,Register.数=0001
return uartData:fromHex()
或者Drehbuch接zuDie Serie收zu的 RTU 帧,去掉 CRC 换成 MBAP 头后通过 TCP 通道发出去。具体见软件自带的 channel-demo.lua 例子。
7.2 MQTT 测试
如果Tests Modbus 网关(DTU 把Seriöse Daten转成 MQTT 发布),LLCOM 的 MQTT Funktion可以直接订阅网关发布的主题,看zu网关发上来的Daten是否Richtig.。还能往控制主题发布消息测试下行。
7.3 Die Serie监听
「Die Serie监听」Funktion可以抓取其他软件正在使用的Serielle Kommunikation——比如你的上位机软件在跟AusrüstungKommunikation,你不想停掉它但想看它发了什么帧。LLCOM 可以静默抓取Seriöse Daten并显示日志,不影响原来的Kommunikation。
八、和同类Werkzeuge的对比
| Werkzeuge | Drehbuch支持 | Modbus CRC | 开源 | 价格 |
|---|---|---|---|---|
| LLCOM | Lua 5.3 + xlua + 协程框架 | 需要自己写(本文已提供) | 是 | kostenlos |
| SSCOM | 无 | 不支持 | 否 | kostenlos |
| COMTool | 有限 | 不支持 | 是 | kostenlos |
| Modbus Poll | 无(专业 Modbus 固定Funktion) | 内置 | 否 | $129 |
| ModScan | 无 | 内置 | 否 | $69 |
LLCOM 不是「开箱即用」的 Modbus 专用Werkzeuge,它是「可以变成 Modbus 专用Werkzeuge的万能Werkzeuge」。如果你只需要点一个Knopf就发 Modbus 帧,Modbus Poll 更直接。但如果你需要批Quantität自动化测试、Custom definiertAnalyse、DatenExportieren、和 MQTT/TCP 联调——LLCOM 是目前开源Werkzeuge里最灵活的。
九、Häufige Fragen
Q: 收zu乱码怎么办? 检查Porter Rate、Prüfstand.是否和Ausrüstung一致。然后在 LLCOM 的Empfang区Wechseln Hex 显示——很多情况下「乱码」是因为Geräte zurück.的是BinärsystemDaten但显示区按 ASCII Analyse了。
Q: CRC Drehbuch发出去的帧Ausrüstung没反应? Die一步:Bestätigen A/B 线没接反。Die二步:在Empfang区看Ausrüstung有没有返回任何Bytes——如果完全没有,可能是Geräte Adresse不对。Die三步:如果Geräte zurück.了Daten但是Ungewöhnlicher Code(Funktionscode + 0x80),看Ungewöhnlicher CodeWas ist das?——0x02 是「Illegale Datenadressen」,Register-Adresse可能nicht existiert.。
Q: 快捷Senden Sie栏的Knopf能自动跑 CRC Drehbuch吗? 能。快捷Senden Sie栏的内容也会经过「Senden Sie处理Drehbuch」——所以你写好了 CRC 自动BerechnungDrehbuch后,快捷Senden Sie栏只需要填裸帧(如 010300000001),点Knopf自动加 CRC。
Q: Lua DrehbuchBetrieb时报错了? 在Drehbuch区域最开头加一行 log.info("boot", "script started") 看Drehbuch是否成功启动。大部UnterteilungFehler.是因为变Quantität名拼错或调用了nicht existiert.的 API——日志区会显示 Lua Fehler.信息。
LLCOM 的核心价值不是多了多少Funktion,而是把「Tests」从重复体力劳动变成了可编程的任务。你在现场花半小时写了三个Drehbuch,接下来三天点几下鼠标Daten自己就来了。这就是「给Die Serie装上大脑」的真正含义——不是 LLCOM 有 AI,是 LLCOM 让你能把自己的Tests逻辑写成代码、然后让软件替你跑。
有问题再聊。
Antwort veröffentlichen