PLC通信协议的转化

在自动化程序设计中,常常需要对通信协议进行相互转化。例如,某个控制器需要通过PLC控制设备的某个部件的运动,但PLC只支持ModbusTCP协议,而控制器只支持CanOpen通讯协议。这时,就需要一个网关进行通信协议的转化。网关有可编程网关和不可编程网关之分,其中后者只能支持简单的转化,如将一句Modbus的报文完整转换为CanOpen,但无法实现将Modbus报文的第一字节转换为CanOpen的第三个PDO的第四个字节等这样的复杂逻辑。所以,如需要对不同的通信协议的报文内容进行任意的拼接组合,则需要使用可编程网关。

本文介绍一下使用有Codesys运行环境的可编程网关进行ModbusTCP和CanOpen通信协议相互转化的程序。这里以广成科技的GCAN-410产品的Codesys版本为例[3],说明如何令该可编程网关同时做CanOpen的从站和ModbusTCP的主站,从而让做CanOpen主站的控制器和做ModbusTCP从站的PLC通过该网关进行通信。其它的协议互转的思路也类似。

一、Codesys简介

首先,Codesys是一种国际通用的工业自动化领域的编程系统,支持IEC 61131-3标准的PLC编程语言[1]。这里主要使用ST语言进行可编程网关的通信协议转换程序设计。例如,可编程网关可以通过Modbus得到PLC的一些变量的值,然后将这些值嵌套在通过CanOpen发出的PDO报文中的规定位置,使得CanOpen主站的控制器可以得到PLC里的数据信息;当然,可编程网关也可通过CanOpen接收到控制器发出的报文,从收到的PDO中提取出数值,并将数值通过Modbus传递给PLC。

二、Modbus简介

Modbus是一种工业通信协议的标准,是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型[2]。这里使用ModbusTCP。简单地说,在Modbus通信中,通信设备有主站也有从站,主站主动发送消息,从站被动回复消息。Modbus的消息分为读取离散输入,读/写线圈,读取输入寄存器,读/写保持寄存器这几种。当主站发出"读取地址从A到B的离散输入"后,从站会将地址在A和B之间的离散输入回复给主站;输入寄存器同理,区别在于离散输入是布尔量,输入寄存器是16位的数值变量;而主站发出"写地址A的线圈为某值"后,从站会把自己的内部的Modbus地址为A的变量写成该值,并返回"写成功"的消息;保存寄存器同理。

Modbus从站中可以设置,或已经内置了每个Modbus地址和PLC内部变量地址的对应关系,如数字输入1对应Modbus的离散输入的地址1,数字输出1对应Modbus的线圈地址1,内部只读变量x对应Modbus的输入寄存器地址10000,内部可读可写变量y对应Modbus的保持寄存器地址20000。所以,Modbus主站通过Modbus报文,可以读取PLC的变量,也可以对PLC的变量进行修改。

三、CanOpen简介

CanOpen是一种基于CAN,在工业自动化中广泛应用的通信协议[4]。一般来说,CanOpen的主站和从站都会发送4个PDO报文,每个PDO报文长度不超过8字节。设备刚启动时,主站会通过NMT报文对从站进行初始化,确保通信能正常进行。控制器,或PLC,都可以设置或已经内置PDO报文里的每一个字节对应的系统内部变量。发出的PDO值里的各字节是PLC内置的各变量的值,而当收到PDO时,里面的字节内容会被用于更新PLC内置的变量值。

四、可编程网关的程序设计

广成科技的GCAN-410产品有一些内置的函数,可以把要通过Modbus和CanOpen发送的报文的数据保存在数组型变量里,同时又有数组型变量存放收到的报文中的数据。

在这里通过调用一些函数,得到这些报文携带的数据。

CanOpenSend(arTPDO_Data := DataCanTransmit, arRPDO_Data => DataCanReceive);
ModbusVariable(arReadBufDiscreteInput => DataModbusReceiveDiscrete, arReadBufInputRegister => DataModbusReceiveAnalog,arWriteBufCoil := DataModbusTransmitDiscrete, arWriteBufHolding := DataModbusTransmitAnalog);

在以上代码中,CanOpenSend是将该网关需要发送和接收的CanOpen报文数据与网关内部的变量绑定在一起的函数。该函数的实现方式随PLC品牌的不同而不同,此处不赘述。该可编程网关要发送的CanOpen的PDO保存在变量DataCanTransmit中,而接受到的PDO保存在变量DataCanReceive中。这两个变量数组均为2维数组,即包含4个8字节数组的大数组。所以,DataCanReceive[1][4]代表接收到的PDO2的第5字节(ST语言中,数组下标从0开始)。发送同理。函数ModbusVariable也类似,但只是1维数组,且在网关中已经设置了Modbus读写的地址范围。

(一)字节变量的转换

例如,我要将网关通过CanOpen收到的PDO2的第8字节对应到Modbus从站的PLC的地址为10的保持寄存器对应的变量,又假定我在ModbusVariable函数中已经设定了网关对Modbus保持寄存器的写动作作用地址为10,则代码如下

DataModbusTransmitAnalog[0] := DataCanReceive[1][7];

DataModbusTransmitAnalog[0]即为写给保持寄存器的地址10的第1字节的数据(注意Modbus的寄存器的一个地址对应2个字节)。

(二)二进制比特的提取和转换

另外,如果在CanOpen收到的PDO3的第3字节是控制器的8个数字输入(一个数字输入占据一个二进制比特),而我希望把第1和第2个数字输入传到PLC的Modbus的第1和第7线圈,如何实现?

DataModbusTransmitDiscrete[0] := DataCanReceive[2][2] AND 16#1;
DataModbusTransmitDiscrete[6] := DataCanReceive[2][2] AND 16#2;

上述代码实现了该功能。DataCanReceive[2][2]是收到的整个字节,而通过将其和16#1及16#2(16#在PLC的ST语言中代表16进制,所以它们用二进制表示则为00000001和00000010)进行AND运算,故只有第1位会进入DataModbusTransmitDiscrete[0]即第1线圈,第2位会进入DataModbusTransmitDiscrete[6]即第7线圈,其它位均被屏蔽。

如果是反过来,要通过读取多个Modbus的离散输入,并将这些比特输入并排形成一个字节传入CanOpen,如何实现?

DataCanTransmit[0][2] := DataModbusReceiveDiscrete[6] AND 16#1;
DataCanTransmit[0][2] := DataCanTransmit[0][2] + (DataModbusReceiveDiscrete[7] AND 16#1) * 2;

在这里,DataModbusReceiveDiscrete[6]是Modbus PLC的地址为6的离散输入,DataModbusReceiveDiscrete[7]是Modbus PLC的地址为7的离散输入,该代码将前者用作PDO1的第3字节的第1比特,后者用作PDO1的第3字节的第2比特。

第一行,将第1比特赋予了地址为6的离散输入的值。第二行,对于地址为7的离散输入的值,在DataModbusReceiveDiscrete[7]中同样处于第1比特。所以要让它移位到第2比特,即提升1个比特,需要用数学运算进行,这里的运算即为* 2。对一个数值乘以2^n,相当于把该数值的所有2进制位提升了n位[5];当然,整除2^n也相当于把该数值的所有二进制位下降了n位。

五、小结

有Codesys运行环境的可编程网关,例如广成科技的GCAN-410,可以通过编程实现各种通讯协议之间的互转,且报文可以互相拼接。拼接的方式,就是将报文的内容对应的变量拆解开,然后将数值赋予另一个通讯协议的变量。对于二进制比特,用AND逻辑进行屏蔽,以及用乘除法进行移位。

参考资料

[1]玩转CODESYS 入门篇(一)-- 认识CODESYS-CSDN博客

[2]ModbusTCP协议 - ioufev - 博客园

[3]沈阳广成科技有限公司

[4]CANopen Tutorial - Siemens

[5]计算机中二进制的移位运算_二进制的乘法移位原理-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146259.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

双击就可以打开vue项目,而不用npm run dev

右键点击桌面或其他位置,选择“新建” -> “快捷方式”,在“对象的位置”处直接输入“npm run dev”,然后下一步 自定义一个快捷方式名称 完成后,桌面会创建一个快捷方式,右键快捷方式选择属性,可以看…

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境

MiniCPM3-4B,轻松在笔记本电脑上运行大模型? 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日,面壁智能发布了MiniCPM3-4B,面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…

proxy认识一下

免责声明:本文仅做分享。 遵守规则,自行跳过。 Proxy 代理技术介绍 1. 代理简介 代理(Proxy) 是指在客户端和目标服务器之间充当中介的设备或应用程序。代理服务器的主要功能是接收客户端的请求,并将这些请求转发给目标服务器&a…

解决Mac下Vscode编译运行C语言程序会自动生成DSYM文件夹的问题

🎉 前言 好久没写C语言了,今天打开Vscode打算写点程序练练手,结果发现一个让我非常苦恼的事情,那就是每次我运行程序的时候,左侧的资源管理器就会生成一大堆的文件,如图: 强迫症犯了&#xff…

模方单体化建模,建模的时候画线突然无法显示垂直线,如何解决?

垂直线对应线都可以在联动软件中设定。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结构,平均1栋复杂建筑物只…

机器翻译之数据处理

目录 1.导包 2.读取本地数据 3.定义函数:数据预处理 4.定义函数:词元化 5.统计每句话的长度的分布情况 6. 获取词汇表 7. 截断或者填充文本序列 8.将机器翻译的文本序列转换成小批量tensor 9.加载数据 10.知识点个人理解 1.导包 #导包 import o…

2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序

2016年国赛高教杯数学建模 A题 系泊系统的设计 近浅海观测网的传输节点由浮标系统、系泊系统和水声通讯系统组成(如图1所示)。某型传输节点的浮标系统可简化为底面直径2m、高2m的圆柱体,浮标的质量为1000kg。系泊系统由钢管、钢桶、重物球、…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

solidwork找不到曲面

如果找不到曲面 则右键找到选项卡,选择曲面

Pybullet 安装过程

Pybullet 安装过程 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件,直接装之前检查下,要不会报缺少某版本MVSC的error,最好的方式是直接下载visual studio,直接按默认的来装。 2. 安装Pybullet 这里…

Mycat中间件

一、案例目标 (1)了解Mycat提供的读写分离功能。 (2)了解MySQL数据库的主从架构。 (3)构建以Mycat为中间件的读写分离数据库集群。 二、案例分析 1.规划节点 使用Mycat作为数据库中间件服务构建读写分…

聚观早报 | 小米三折叠手机专利曝光;李斌谈合肥投资蔚来

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 9月20日消息 小米三折叠手机专利曝光 李斌谈合肥投资蔚来 索尼PS5 Pro包装亮相 新一代Spectacles AR眼镜发布 通…

媒体专访 | CertiK首席安全官李康教授:变化中的加密资产监管环境带来了新机遇

在2024韩国区块链周期间,CertiK首席安全官李康教授接受了韩国媒体E-Today的独家专访。采访中,李康教授探讨了加密资产监管环境的最新动态及其为行业带来的新机遇。同时,他也表达了对加密资产生态系统所面临的安全挑战的担忧,并强调…

无人机视角应急救援(人)数据集

无人机视角应急救援(人),两个数据集 part1,使用DJI Phantom 4A拍摄,分辨率为19201080像素。山区场景,图像中人员姿势分为站立、坐着、躺着、行走、奔跑。共1981张图像6500个不同姿势的标记, par…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了,发现还是写博客学的效率高点,在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点,用来验证这个平台的扩展性,以及总结一些学过的知识。…

Vue使用代理方式解决跨域问题

1、解决跨域问题 如果 Vue 前端应用请求后端 API 服务器,出现跨域问题(CORS),如下图: 解决方法:在 Vue 项目中,打开 vue.config.js 配置文件,在配置文件中使用代理解决跨域问题。 …

腾讯云ssl证书到期,续期免费证书并部署

首先咱用的免费证书,现在最长90天有效期,今天又到期了,得及时续期避免关联资源访问受限。 我这个证书是关联了一个负载均衡和两个容器服务的(如果您的应用是ngnix或其他的应用那和本文操作可能有点不一样) 所以需要做…

SpringCloud (1) 服务拆解

1 服务拆解和治理 1.1 服务拆解 微服务的核心就是服务拆分,将传统的大项目拆分为多个微型服务(服务或微服务),实现服务之间"高内聚(微服务职责单一),低耦合(微服务功能相对独立)"的目的 (1) 水平(横向)拆分:先搭出拆分框架,比如【公共服务】(比如:common服务,client…

Redis作为单线程模型,为什么效率高、速度快呢?

前言: 效率高、速度快是相较于数据库来说的(MySQL、Orcale、SQL server) 文章目录 一、单线程模式的工作流程二、为什么快? 一、单线程模式的工作流程 这里我们所说的单线程是指:Redis只使用一个线程,来处…

从零到一:打造安全高效敦煌测评自养号体系

敦煌测评自养号是一种提升店铺销售和排名的有效策略,卖家可以自行注册并管理买家账号,通过模拟真实买家行为为自家店铺进行测评和补单。以下是一些关键技巧,帮助卖家快速提升销售和排名: 一、账号注册与养号 环境搭建&#xff1…