ZeroOne AI
← 返回文章列表

TRIO-Basic 从入门到精通(十二):Trio 实现 ModbusTCP 通讯

👁 3
分类:机器人自动化

本教程演示两台Trio控制器间基于ModbusTCP的以太网通讯,主站通过MODBUS指令对从站保持寄存器进行读写,并实现快速超时、断线重连等可靠通讯机制,适用于与PLC、传感器等从站设备的数据交换。

"# TRIO-Basic 从入门到精通(十二):Trio 实现 ModbusTCP 通讯\n\n## 一、教程背景\n\nModbusTCP 是工业自动化领域应用最广泛的以太网通讯协议之一,基于 TCP/IP 传输,具有实现简单、兼容性强的特点。在运动控制系统中,Trio 控制器常需要与 PLC、传感器、HMI 或其他控制器进行数据交换,ModbusTCP 正是完成这类任务的高效手段。\n\n本教程以两台 Trio 控制器为例,演示主站与从站之间的 ModbusTCP 通讯:主站通过以太网轮询从站的数据寄存器,实现读写操作。作为从站时,Trio 默认开启 ModbusTCP 协议,通讯端口为 502。从站可以是任何支持 ModbusTCP 协议的控制器或传感器,因此本方案具有很强的通用性。\n\n## 二、技术要点/技术方案\n\n测试配置:\n\n- 主站(Trio):IP 地址 192.168.0.251\n- 从站(Trio):IP 地址 192.168.0.250,通讯端口 502\n\n核心指令与参数:\n\n- MODBUS 指令:用于建立 ModbusTCP 连接及读写数据。建立连接时通过 MODBUS(0, -1, 192, 168, 0, 250, 502, com_index) 指定从站 IP 与端口;关闭连接使用 MODBUS(1, -1, modbus_handle)。\n- 功能码 ex_modbus_func = $03:读取保持寄存器(Holding Register)。\n- 读操作:MODBUS(ex_modbus_func, -1, VR(20), 3, 1000, 10),从寄存器地址 1000 开始读取 10 个保持寄存器值存入 VR(20) 起始的数组。\n- 写操作:MODBUS(ex_modbus_func, -1, VR(20), 16, 1010, 10),将 VR(20) 起始的 10 个值写入从寄存器地址 1010 开始的保持寄存器。\n- 通讯句柄通过 VR(com_index)(com_index=4000)保存。\n- IP_TCP_TX_TIMEOUT = 50:设置 TCP 发送超时,实现快速超时响应。\n\n程序特性:\n\n1. 通讯快速超时功能\n2. 断线自动重连功能\n3. 超时无响应自动重连功能\n\n## 三、实施步骤\n\n1. 将两台 Trio 控制器接入同一以太网,分别设置主站 IP 为 192.168.0.251、从站 IP 为 192.168.0.250。\n2. 确认从站已开启 ModbusTCP 服务(Trio 默认开启,端口 502)。\n3. 在主站编写程序:定义通讯句柄变量(com_index=4000)、功能码变量($03)、打印端口(print_port=5)及超时/轮询周期参数(read_timeout=250loop_time=100)。\n4. 主循环中:若未连接则调用 open_mod 子程序建立连接;连接成功后依次执行读保持寄存器与写保持寄存器操作,并打印每次读写耗时(ReadUseTime)。\n5. 设置发送超时 IP_TCP_TX_TIMEOUT=50,保证通讯快速超时。\n6. 按 loop_time 周期轮询,循环执行读写;连接异常时自动重连。\n\n## 四、代码示例\n\nbasic\nDIM com_index AS INTEGER\ncom_index=4000\nmodbus_handle=VR(com_index)\nDIM ex_modbus_func AS INTEGER\nex_modbus_func = $03\n\nDIM print_port AS INTEGER\nprint_port=5\n\nDIM read_timeout,loop_time,save_looptick,read_tmptick AS INTEGER\nTICKS=0\nread_timeout=250\nloop_time=100\nsave_looptick=TICKS\nDIM tx_connectok AS BOOLEAN\ntx_connectok=FALSE\n\n'IP_TCP_TX_TIMEOUT = 1000\nIP_TCP_TX_TIMEOUT=50\n\n'==============================================================\nWHILE TRUE\n IF tx_connectok=FALSE THEN\n GOSUB open_mod\n ELSE\n read_tmptick=TICKS\n\n ' get 10 values from holding registers\n IF tx_connectok THEN tx_connectok=MODBUS (ex_modbus_func, -1, VR(20), 3 , 1000 , 10 )\n ' send 10 values to holding registers\n IF tx_connectok THEN tx_connectok=MODBUS (ex_modbus_func, -1, VR(20), 16 , 1010 , 10 )\n IF tx_connectok THEN PRINT#print_port,TIME$,\"ReadUseTime=\",ABS(read_tmptick-TICKS)\n ENDIF\n\n REPEAT\n WA(5)\n UNTIL ABS(save_looptick-TICKS)>=loop_time\n save_looptick=TICKS\nWEND\n\n'==============================================================\nWA(50)\nSTOP\n\nopen_mod:\n'Close Modbus connection\nMODBUS(1,-1,modbus_handle)\nWA(20)\n'IP Address 192.168.0.250, Port Number 502\nIF MODBUS(0,-1,192,168,0,250,502,com_index)=TRUE THEN\n modbus_handle = VR(com_index)\n PRINT #print_port,TIME$,\"connect TCP PORT ok:\",modbus_handle\n tx_connectok=TRUE\nELSE\n PRINT #0,TIME$,\"connect TCP PORT ng:\",modbus_handle\n tx_connectok=FALSE\nENDIF\nWA(20)\n\nRETURN\n\n\n## 五、应用价值\n\n1. 提供了一套完整的 Trio 主站与从站间的 ModbusTCP 通讯方案,可直接移植到项目中使用。\n2. 通过 IP_TCP_TX_TIMEOUT 实现毫秒级快速超时,避免通讯故障时长时间阻塞。\n3. 具备断线重连与超时无响应重连机制,提高系统长期运行的可靠性。\n4. 支持任意符合 ModbusTCP 标准的从站设备(PLC、传感器等),扩展性强。\n5. 主循环采用定时轮询模式,读写时序可控,便于与其他运动控制任务协同调度。\n\n## 六、SEO关键词\n\nTRIO运动控制器,TRIO-Basic,ModbusTCP通讯,翠欧控制器,以太网通讯,保持寄存器读写,断线重连,TrioWay\n\n---\n\n本文内容整理自 guimotion 的《TRIO-Basic从入门到精通教程》系列(CSDN,CC BY-SA 4.0),由 ZeroOne AI 重新组织编写。\n"

评论(0