关于使用TCP-S7协议读写西门子PLC字符串的问题

news/2024/12/22 11:00:05/

我们可以使用TCP-S7协议读写西门子PLC,

比如PLC中定义一个String[50] 的地址DB300.20

地址DB300.20

DB块编号为300,偏移量【地址】是30

S7协议是西门子PLC自定义的协议,默认端口102,本质仍然是TCP协议的一种具体实现,

如果使用C#读写西门子PLC协议,需要开启一个TcpClient,然后连接102端口。然后发哦送两次握手之后即可读写。

一、PLC需要设置 运行远程对象的Put/GET访问

 二、PLC还要手动开启对应DB块的【非优化访问】,DB块默认是【优化访问的,无偏移量】

对西门子PLC字符串的读写逻辑如下:

西门子PLC字符串逻辑 string[50],占用52个字节(偏移量),第一个字节是最大长度,就是50,第二个字节是实际长度24,第三个字节之后就是ASCII码,

PLC解析逻辑为找到第二个字节的长度length.,然后查找length个字符,就结束

示例读写西门子字符串代码如下:

        /// <summary>/// 写入西门子PLC的字符串,写入的字节长度为length+2,其中第一个字节代表最大长度【PLC设定的】,第二个字节代表时间长度/// </summary>/// <param name="dbNumber"></param>/// <param name="offsetAddress"></param>/// <param name="maxLength"></param>/// <param name="writeString"></param>/// <returns></returns>static bool DB_WriteString(short dbNumber, ushort offsetAddress, int maxLength, string writeString) {byte[] byteArray = new byte[maxLength + 2];byteArray[0] = (byte)maxLength;//第一个字节代表最大长度byteArray[1] = (byte)writeString.Length;//第二次字节代表实际长度if (byteArray[1] > byteArray[0]) {throw new Exception($"实际长度【{byteArray[1]}】不能超过PLC字符串的最大设定长度【{maxLength}】");}byte[] stringByteArray = System.Text.Encoding.ASCII.GetBytes(writeString);Array.Copy(stringByteArray, 0, byteArray, 2, stringByteArray.Length);//第三个字节开始写入字符串的ASCII码return WriteSerialByteArray(dbNumber, offsetAddress, byteArray);}static bool WriteSerialByteArray(short dbNumber, ushort offsetAddress, byte[] byteArray) {Console.WriteLine($"这里写入DB{dbNumber}.{offsetAddress}的连续字节数组【{string.Join(",", byteArray.Select(x => x.ToString("X2")))}】");return true;}static bool ReadSerialByteArray(short dbNumber, ushort offsetAddress, out byte[] byteArray){            byteArray = new byte[] { 12, 6, 48, 49, 97, 98, 65, 66, 0, 0, 0, 0 };//假设读取12个字节Console.WriteLine($"这里读取DB{dbNumber}.{offsetAddress}的连续字节数组【{string.Join(",", byteArray.Select(x => x.ToString("X2")))}】");return true;}/// <summary>/// 读取字符串:从第三个字节开始,读取实际长度个字符  actualLength = byteArray[1]/// </summary>/// <param name="dbNumber"></param>/// <param name="offsetAddress"></param>/// <param name="readString"></param>/// <returns></returns>static bool DB_ReadString(short dbNumber, ushort offsetAddress, out string readString){ReadSerialByteArray(dbNumber, offsetAddress, out byte[] byteArray);if (byteArray.Length < 2) {throw new Exception($"读取字符串时,原字节数组长度不能低于2");}byte maxLength = byteArray[0];byte actualLength = byteArray[1];if (byteArray.Length - 2 < actualLength) {throw new Exception($"读取到的字节长度 小于 实际长度,非法的读取,PLC设定的字符串最大长度为【{maxLength}】");}readString = System.Text.Encoding.ASCII.GetString(new ArraySegment<byte>(byteArray, 2, actualLength).ToArray());return true;}


http://www.ppmy.cn/news/1394890.html

相关文章

微服务跨域问题|The ‘Access-Control-Allow-Origin‘ header contains multiple values

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 参考 Spring Cloud Gateway CORS 方案看这篇就够了-腾讯云开发者社区-腾讯云 九种跨域方式实现原理&…

【MySQL】MySQL小结

MySQL数据库的基本信息 数据&#xff1a;记录事物的信息 表&#xff1a;数据的集合&#xff0c;由行和列组成&#xff1b;将多条数据组合在一起 数据库&#xff1a;是表的集合&#xff0c;是存储以统一格式且相互有关数据的仓库 DBMS的主要功能&#xff1a;1.数据库的建立和维…

Java毕业设计-基于springboot开发的网吧管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录2、管理员功能模块3、网管功能模块4、会员功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的…

馆室一体化查档平台制度有哪些

馆室一体化查档平台制度是指图书馆或档案馆在数字化和信息化的背景下&#xff0c;建立起的集查阅、借阅、咨询、文献传递等多项功能于一体的平台制度。下面是一些常见的馆室一体化查档平台制度&#xff1a; 1. 馆藏管理制度&#xff1a;包括图书和档案的采购、编目、分类、整理…

R语言Meta分析核心技术:回归诊断与模型验证

R语言作为一种强大的统计分析和绘图语言&#xff0c;在科研领域发挥着日益重要的作用。其中&#xff0c;Meta分析作为一种整合多个独立研究结果的统计方法&#xff0c;在R语言中得到了广泛的应用。通过R语言进行Meta分析&#xff0c;研究者能够更为准确、全面地评估某一研究问题…

Java项目中的web.xml文件的作用?

Java项目中的web.xml文件是Java Web应用程序的核心配置文件,它是根据Java Servlet规范定义的部署描述符(Deployment Descriptor)。在传统的Servlet/JSP应用中,web.xml文件位于Web应用的WEB-INF目录下,用于配置Web应用的行为和组件设置,具体作用包括但不限于以下几点: 配…

Javascript由浅到深

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

二叉树的遍历及线索二叉树试题解析

一、单项选择题 01.在下列关于二叉树遍历的说法中&#xff0c;正确的是( C ). A.若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点&#xff0c;则它一定是该子树的前序遍历结果序列的最后一个结点 B.若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一…