LabVIEW 通讯与罗克韦尔 AB Allen Bradley PLC通讯 EhernetIP 网口TCP标签通讯 SL500实测通过。 常用功能一网打尽。 1.命令帧读写。 2.支持 I16 I32 Float 批量读写。 3.支持字符串读写。 4.支持Bool批量读写。 5.支单点读写。 6.标签管理 程序源码,命令帧文本编写,不调用dll,不安装插件,完胜OPC 等。
最近在工业项目里用LabVIEW搞定了AB PLC的Ethernet/IP通讯,实测SL500系列稳如老狗。直接上TCP网口干标签读写,不依赖OPC和第三方DLL,代码全裸奔,这感觉比用现成插件爽太多了。
先说核心——命令帧直接怼。LabVIEW用TCP节点发十六进制报文,比如读单个Bool点:
TCP Write: 00 00 00 00 00 06 00 6F 01 01 00 00 TCP Read: XX XX XX XX XX XX [返回数据]这堆Hex不是乱写的,前6字节是Ethernet/IP头,00 6F是服务代码,01 01对应标签地址。实测时发现AB的报文喜欢用大端序,LabVIEW默认是小端,所以得用Swap Bytes函数手动调教。
批量读浮点数更刺激。比如要读10个Float标签,命令帧里得塞进数据长度和元素个数:
命令帧骨架: 52 02 20 06 24 01 [标签名长度] [标签名] 00 00 A0 02 00 00 04 00 [元素数量]在代码里用Flatten To String把数值转成二进制流,再用Type Cast强行转成U8数组。解析回Float时,如果遇到NaN,大概率是字节序没对齐——这时候就该掏出Reverse 1D Array来救场。
字符串读写最坑的是长度前缀。AB的String类型前两字节是最大长度,后两字节是实际长度。LabVIEW发数据前得先拼个前缀:
字符串处理代码示例: 字符串数据 -> 拼接 00 20 00 0A (假设最大32字符,实际10字符) -> 转U8数组实测发现如果超出最大长度,PLC会直接丢异常。所以在LabVIEW里先用String Subset+Length做个强制截断,稳得一批。
LabVIEW 通讯与罗克韦尔 AB Allen Bradley PLC通讯 EhernetIP 网口TCP标签通讯 SL500实测通过。 常用功能一网打尽。 1.命令帧读写。 2.支持 I16 I32 Float 批量读写。 3.支持字符串读写。 4.支持Bool批量读写。 5.支单点读写。 6.标签管理 程序源码,命令帧文本编写,不调用dll,不安装插件,完胜OPC 等。
Bool批量读写玩的是位操作。比如要把第3/5/7位置True:
命令帧关键部分: 00 00 00 01 (1字节掩码) -> 二进制00000101转十六进制05LabVIEW里用Number To Boolean Array把数值转成布尔数组,再按位做OR运算生成掩码。遇到需要跨字节的情况,得手动补零对齐,不然PLC会傲娇地返回错误码。
标签管理这块,我直接写了个动态解析器。把PLC的标签表导成CSV,用LabVIEW的Read Spreadsheet加载,运行时根据标签名自动生成地址映射。比如Motor1.Speed对应DB200.DBD10,代码里直接查表拼报文,省去了手动配置地址的麻烦。
代码仓库里扔了个实战用的工具包,包含报文构造器和异常处理模版。实测SL500的读写速度比OPC UA快至少30%,尤其是Bool点高频读写时,OPC的订阅机制反而成了瓶颈。
最后奉劝:别手贱在同一个TCP连接里混用读写操作!AB的协议层有个会话ID机制,建议用TCP Open开双通道,一个专读一个专写。别问我怎么知道的——连续熬夜三天抓包的血泪教训。
源码已传GitHub(防杠声明:去公司化数据版),评论区丢暗号"AB硬刚"自动回复链接。