PLC通信协议的转化

news2024/12/25 12:29:28

在自动化程序设计中,常常需要对通信协议进行相互转化。例如,某个控制器需要通过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.coloradmin.cn/o/2151541.html

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

相关文章

Thymeleaf模版引擎

Thymeleaf是面向Web和独立环境的现代服务器端Java模版引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf旨在提供一个优雅的、高度可维护的创建模版的方式。为了实现这一目标,Thymeleaf建立在自然模版的概念上,将其逻辑注入到模…

VUE3配置路由(超级详细)

第一步创建vue3的项目

(八)使用Postman工具调用WebAPI

访问WebAPI的方法&#xff0c;Postman工具比SoapUI好用一些。 1.不带参数的get请求 [HttpGet(Name "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() {return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateT…

【TabBar嵌套Navigation案例-JSON的简单使用 Objective-C语言】

一、JSON的简单使用 1.我们先来看一下示例程序里边,产品推荐页面, 在我们这个产品推荐页面里面, 它是一个CollectionViewController,注册的是一个xib的一个类型,xib显示这个cell,叫做item,然后,这个邮箱大师啊,包括这个图标,以及这些东西,都是从哪儿来的呢,都是从…

NLP 主要语言模型分类

文章目录 ngram自回归语言模型TransformerGPTBERT&#xff08;2018年提出&#xff09;基于 Transformer 架构的预训练模型特点应用基于 transformer&#xff08;2017年提出&#xff0c;attention is all you need&#xff09;堆叠层数与原transformer 的差异bert transformer 层…

SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能&#xff0c;PageHelper是一个非常流行的MyBatis分页插件&#xff0c;它支持多数据库分页&#xff0c;无需修改SQL语句即可实现分页功能。 本文在最后展示了两种依赖验证的结果。 文章目录 一、第一种依赖方式二、第二种依赖方式三、创建数…

低空经济刚需篇:各种道路不畅地区无人机吊装详解

低空经济作为近年来备受关注的新兴经济形态&#xff0c;其核心在于利用3000米以下的低空空域进行各种飞行活动&#xff0c;以无人机、电动垂直起降飞行器(eVTOL)等为载体&#xff0c;推动交通、物流、巡检、农林植保、应急救援等多领域的变革。在道路不畅的地区&#xff0c;无人…

信息安全数学基础(20)中国剩余定理

前言 信息安全数学基础中的中国剩余定理&#xff08;Chinese Remainder Theorem&#xff0c;简称CRT&#xff09;&#xff0c;又称孙子定理&#xff0c;是数论中一个重要的定理&#xff0c;主要用于求解一次同余式组。 一、背景与起源 中国剩余定理最早见于我国南北朝时期的数学…

存储 NFS

目录 1.存储的应用场景 2.存储分类 3.NFS服务组成 4.环境说明 ​编辑 5.服务端部署 6.NFS服务端的配置 7.NFS服务端本地进行测试 1.存储的应用场景 存储一般用于上传网站数据&#xff08;内容&#xff09;&#xff0c;一般用于在网站集群中。使用存储的话用户上传的…

推荐系统-电商直播 多目标排序算法探秘

前言&#xff1a; 电商直播已经成为电商平台流量的主要入口&#xff0c;今天我们一起探讨推荐算法在直播中所面临的核心问题和解决方案。以下内容参考阿里1688的技术方案整理完成。 一、核心问题介绍 在电商网站中&#xff0c;用户的主要行为是在商品上的行为&#xff0c;直播…

Java8四大函数接口

一、说明 1.函数式接口的使用说明说明&#xff1a; 函数式接口是Java8的一个新特性。如果一个接口中&#xff0c;只声明了一个抽象方法&#xff0c;则此接口就称为函数式接口。我们可以在一个接口上使用 FunctionalInterface 注解&#xff0c;这样做可以检查它是否是一个函数…

【数据结构】排序算法---基数排序

文章目录 1. 定义2. 算法步骤2.1 MSD基数排序2.2 LSD基数排序 3. LSD 基数排序动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 ⚠本节要介绍的不是计数排序 1. 定义 基数排序&#xff08;英语&#xff1a;Radix sort&#xff09;是一种非比较型的排序算法&…

基于ExtendSim的 电子制造 仿真模型

说明&#xff1a; 此模型表示电路板制造设施。该过程有4个步骤&#xff1a; *焊料制备 *组件放置 *烤箱 *检查 详情&#xff1a; *烤箱的容量为10张卡&#xff0c;但如果烤箱循环开始时仅能处理5张卡&#xff0c;则最多只能处理5张。 *如果检查员发现问题&#xff0c;他们将修理…

C++——map和set的使用以及map系列

目录 map和set的使用 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查 set的增删查关注以下⼏个接⼝即可&#xff1a; 2.6 find和erase使⽤样例&#xff1a; lower_bound(); upper_bo…

Css_动态渐变圆圈旋转效果

1、效果图 2、实现代码 <template><div class"box"><div class"line"></div><div class"lineNew"></div></div> </template><script lang"ts" setup></script><styl…

MySQL篇(存储引擎 - InnoDB存储引擎架构)(持续更新迭代)

目录 一、逻辑存储结构 1. 表空间 2. 段 3. 区 4. 页 5. 行 二、架构 1. 简介 2. 内存结构&#xff08;四部分&#xff09; Buffer Pool Change Buffer Adaptive Hash Index Log Buffer 3. 磁盘结构&#xff08;七部分&#xff09; System Tablespace File-Per-…

pdf文件怎么直接翻译?使用这些工具让翻译变得简单

在全球化日益加深的职场环境中&#xff0c;处理外语PDF文件成为了许多职场人士面临的共同挑战。 面对这些“加密”的信息宝库&#xff0c;如何高效、准确地将英文pdf翻译成对应语言&#xff0c;成为了提升工作效率的关键。 以下是几款在PDF翻译领域表现出色的软件&#xff0c…

化繁为简:中介者模式如何管理复杂对象交互

化繁为简&#xff1a;中介者模式如何管理复杂对象交互 中介者模式 是一种行为型设计模式&#xff0c;定义了一个中介者对象&#xff0c;来封装一组对象之间的交互。中介者模式通过将对象之间的交互行为从多个对象中抽离出来&#xff0c;集中封装在一个中介者对象中&#xff0c;…

智能除螨仪——NV040D-SOP8语音芯片方案引领除螨仪新时代

随着物联网技术的快速发展&#xff0c;除螨仪作为家庭清洁的重要工具&#xff0c;其智能化、人性化的设计成为提升市场竞争力的关键。置入语音芯片的除螨仪&#xff0c;通过开机提示、工作状态反馈、操作指引、故障提醒等内容。用户可以更加直观地了解除螨仪的工作状态&#xf…

开发谷歌插件之GA埋点

目录 一、背景 二、踩坑 三、谷歌插件开发的GA埋点的实现方式 一、背景 开发了一个谷歌插件&#xff0c;领导需要对用户的一些行为进行分析&#xff0c;于是让我在代码里面加上GA埋点。由于我们的PC端的项目一直都有进行GA埋点&#xff0c;当时就想着&#xff0c;这不就是把…