TRIO-Basic 从入门到精通(十八):Trio运动控制器UDP快速交换数据通讯
本文介绍TRIO运动控制器之间基于UDP的快速数据交换通讯方案:将初始化与收发数据核心代码封装为SINOLIB.BAL库,通过dgram数据报通道与IEEE浮点编解码,实现两台MC405控制器周期性实时交换数据,无需预建立连接,通讯稳定不断线。
TRIO-Basic 从入门到精通(十八):Trio运动控制器UDP快速交换数据通讯
一、教程背景
在实际项目中,经常遇到两台或多台运动控制器之间需要实时交换数据的场景,例如双机联动、数据共享、主从协调等。本文给出一个基于 UDP 的快速数据交换通讯方案,通过 TRIO-Basic 将通讯核心代码封装成库,实现两个或多个控制器之间高效、稳定的数据交换,可满足常见的双控制器通讯需求。
二、技术要点
- 通讯方案配置:本实例使用两台控制器(均为 MC405,IP 地址分别为 192.168.0.8 与 192.168.0.9),通过一台交换机互联。
- UDP 数据报通道:使用
dgram:IP(端口)格式的通道字符串打开 UDP 数据报通道,端口可自定义(示例中使用 8899)。 - 库函数封装:通讯核心代码封装在
SINOLIB.BAL库中,包含三个函数:initudp(ipadr, sockport):初始化 UDP 通讯,设置目标 IP 地址和端口号;recvdata(startadr, num):读取数据包并保存到指定寄存器(VR);senddata(startadr, num):发送数据包,自动从指定寄存器抓取数据。
- 数据帧格式:发送数据以
@开头作为帧头,随后按每 4 字节一个 FLOAT 依次编码数据,以回车换行(CR+LF)结尾;接收方校验帧头@后按同样规则解析为 FLOAT 存入寄存器。单次最多传输 60 个数据点。 - 浮点编解码:使用
IEEE_OUT/IEEE_IN指令完成 FLOAT 与 4 字节整数之间的转换,保证数据在网络上传输的准确性。
三、实施步骤
- 搭建网络环境:将两台 MC405 控制器与一台交换机组网,分别设置 IP 为 192.168.0.8 和 192.168.0.9。
- 编写通讯库:新建库文件
SINOLIB.BAL,将initudp、recvdata、senddata三个函数封装进去。 - 编写主程序:在实际工程代码中调用库函数——先设置本机 IP 与对端 IP,调用
initudp初始化通讯;在主循环中按设定的周期(示例为 100ms)调用senddata发送数据,并在每个循环周期调用recvdata接收数据。 - 周期控制:通过系统 TICKS 计时器判断是否到达数据交换周期,到达时执行发送,避免占用过多 CPU。
- 运行验证:分别在两台控制器上运行程序,观察双方数据收发是否正常。
四、代码示例
通讯库文件 SINOLIB.BAL:
'初始化控制UDP通讯
'ipadr ip地址数据 192.168.0.9
'sockport ip地址端口 8899
FUNCTION initudp(ipadr AS STRING,sockport AS INTEGER)
DIM ipadrframe AS STRING(64)
DIM channel AS INTEGER
channel=20
ipadrframe ="dgram:"
ipadrframe =ipadrframe+ipadr
ipadrframe =ipadrframe+"("
ipadrframe =ipadrframe+STR(sockport,0)
ipadrframe =ipadrframe+")"
IF CONTROL >400 THEN
OPEN #channel AS ipadrframe FOR READ_WRITE
PRINT #0,"Init udp network:",ipadrframe
ENDIF
ENDFUNC
'等待接受数据
'startadr 数据存放地址
'num 数据存放长度
FUNCTION recvdata(startadr AS INTEGER,num AS INTEGER)
DIM getdata AS STRING(255)
DIM getinter AS INTEGER(4)
DIM channel AS INTEGER
DIM idex_read AS INTEGER
DIM get_float AS FLOAT
IF num >60 THEN
num=60
ENDIF
channel=20
IF KEY#channel THEN
'wait recv delay time
WA(1)
CHANNEL_READ(channel,getdata)
'"@" start
IF ASC(getdata)=64 THEN
FOR idex_read=0 TO num-1
getinter(0)=ASC(MID(getdata,1+idex_read*4))
getinter(1)=ASC(MID(getdata,2+idex_read*4))
getinter(2)=ASC(MID(getdata,3+idex_read*4))
getinter(3)=ASC(MID(getdata,4+idex_read*4))
get_float=IEEE_IN(getinter(0),getinter(1),getinter(2),getinter(3))
VR(startadr+idex_read)=get_float
NEXT idex_read
ENDIF
ENDIF
ENDFUNC
'发送数据
'startadr 数据存放地址
'num 数据存放长度
FUNCTION senddata(startadr AS INTEGER,num AS INTEGER)
DIM getdata AS STRING(255)
DIM getinter AS INTEGER(4)
DIM channel AS INTEGER
DIM idex_read AS INTEGER
DIM get_float AS FLOAT
IF num >60 THEN num=60
channel=20
'send header data
getdata="@"
FOR idex_read=0 TO num-1
get_float=VR(startadr+idex_read)
getinter(0)=IEEE_OUT(get_float,0)
getinter(1)=IEEE_OUT(get_float,1)
getinter(2)=IEEE_OUT(get_float,2)
getinter(3)=IEEE_OUT(get_float,3)
getdata =getdata + CHR(getinter(0))
getdata =getdata + CHR(getinter(1))
getdata =getdata + CHR(getinter(2))
getdata =getdata + CHR(getinter(3))
NEXT idex_read
getdata =getdata +CHR(13)+CHR(10)
PRINT #channel,getdata;
ENDFUNC
实际工程代码调用库函数:
'设置保存时钟
DIM save_ticks,setpt_ticks AS INTEGER
DIM local_ipadr,send_ipadr AS STRING(32)
DIM main_program AS INTEGER
main_program=0
IF main_program=0 THEN
local_ipadr="192.168.0.8"
send_ipadr="192.168.0.9"
ELSEIF main_program=1 THEN
local_ipadr="192.168.0.9"
send_ipadr="192.168.0.8"
ENDIF
IP_ADDRESS=local_ipadr
WA(100)
PRINT #0,"set local network:",local_ipadr
PRINT #0,"set send network:",send_ipadr
TICKS=0
'设置交换数据周期:单位ms
setpt_ticks=100
save_ticks=TICKS
'初始化控制UDP通讯
'ipadr ip地址数据 192.168.0.9
'sockport ip地址端口 8899
'FUNCTION initudp(ipadr AS STRING,sockport AS INTEGER)
initudp(send_ipadr,8899)
WHILE TRUE
IF ABS(save_ticks-TICKS)>=setpt_ticks THEN
save_ticks=TICKS
senddata(2000,20)
ENDIF
'read data per loop time
recvdata(3000,20)
WA(10)
WEND
五、应用价值
- 无需提前建立连接,单方上线即可即时通讯,组网简单灵活。
- 数据实时发送,通讯过程无断线问题,满足现场实时性要求。
- 通讯核心代码封装成库,可在多个项目中复用,开发效率高。
- 支持两台及以上控制器间数据交换,适用于双机联动、数据共享等场景。
- 数据帧格式简洁、周期可控,方便与上位机或其他设备对接扩展。
六、SEO关键词
TRIO运动控制器, TRIO-Basic, UDP通讯, 运动控制器通讯, MC405, 数据交换, 控制器互联, 实时通讯, 工业以太网
本文内容整理自 guimotion 的《TRIO-Basic从入门到精通教程》系列(CSDN,CC BY-SA 4.0),由 ZeroOne AI 重新组织编写。
