网站首页 > 博客文章 正文
一.前面讲了S7连接的握手过程,及读取DB的算法,今天我们讲讲如何写DB区
今天手里有1200,那就继续用实体PLC测试,再尝试用威纶通触摸屏连接PLC进行抓包解析,首先环境准备。
硬件环境:S71200
软件环境:威纶通EasyBuilder、TIAV16、Wireshark抓包工具、VS2019
二.开始抓包分析吧
1.电脑IP:192.168.0.227
2.PLCIP:192.168.0.50
3.用威纶通触摸屏组态软件在线模拟监控DB2.DBW2用写入数据8
4.抓报文,老规矩从这么多报文里面找到有价值的数据,多次尝试,分析
5.报文分析,由于我们操作DB区有可能操作其bool位,所以是有必要把bit位的操作考虑进去。
6.重点,如图分析,控制写地址有三个字节,多分析几个报文看到规律第28 29 30,控制要写的地址
高21位是控制字节位置的,左移二进制把低三位位置腾出来,或者乘以8,低3位控制bit位(2^3)不能超过8.
由于3个字节中,前面21位是控制字节位置的,我们获取bit16-bit23字节,与0xff0000获得,再右移16位让它可以存在高8位字节,大端存储方式。
7.分析报文发现第2(高8位)、3(低8位)字节是控制整个报文字节数
8.分析报文看到规律第33(高8位)34(低8位)控制要写的bit数量,一个字节8个bit位,乘以8就是最终二进制位。
9.我们分析多次报文,发现第11(高8位)12(低8位)字节控制通讯参考标识,怎么理解?通过悟性可以悟到,这东西就相当于给通讯的每一笔数据起个名字,用来区分不同笔报文。
10.其他报文前面几讲,有讲了。
三.我们开始撸代码吧
1.接着前面代码写,写DB的算法代码
2.源代码我也贴了上来
int refercence = 888;//通讯参考标识
/// <summary>
/// 写DB的方法字节排序大端 参考1413笔数据
/// </summary>
/// <param name="DB">DB号</param>
/// <param name="startByte">起始字节数</param>
/// <param name="writeBs">写多少个字节</param>
/// <returns></returns>
public bool WriteDB(int DB,int startByte, byte[] writeBs)
{
//固定35个字节,加上我要写的字节组成报文,由于长度可变我们用list
List<byte> s7Comm = new List<byte>()
{
0x03,0x00,0x00,0x25,0x02,0xf0,0x80,0x32,0x01,0x00,
0x00,0xa0,0x00,0x00,0x0e,0x00,0x06,0x05,0x01,0x12,
0x0a,0x10,0x02,0x00,0x02,0x00,0x02,0x84,0x00,0x00,
0x40,0x00,0x04,0x00,0x10//...数据区
};//0x84代表DB区
//分析报文看到规律第2(高8位)3(低8位)控制要写的报文长度 ,获得字节数组 先转为ushort类型是为了确定输出字节为2个固定35个字节
byte[] bs = BitConverter.GetBytes((ushort)(35 + writeBs.Length));
s7Comm[02] = bs[1];
s7Comm[03] = bs[0];
refercence++; //通讯参考标识每次自增 相当于给这个报文起了个名字
bs = BitConverter.GetBytes((ushort)refercence);
s7Comm[11] = bs[1];
s7Comm[12] = bs[0];
bs = BitConverter.GetBytes((ushort)(writeBs.Length+4));//data 长度 这里指的item长度 固定长度4+可变长度数据
s7Comm[15] = bs[1];
s7Comm[16] = bs[0];
bs = BitConverter.GetBytes((ushort)writeBs.Length); //分析报文看到规律第23(高8位)24(低8位)控制要写的字节数
s7Comm[23] = bs[1];
s7Comm[24] = bs[0];
bs = BitConverter.GetBytes((ushort)DB);//分析报文看到规律第25(高8位)26(低8位)控制要写的DB号
s7Comm[25] = bs[1];
s7Comm[26] = bs[0];
//重点 分析报文看到规律第28 29 30,控制要写的地址,高21位是控制字节位置的,左移二进制把低三位位置腾出来,低3位控制bit位(2^3)不能超过8
uint startByte1 = (uint)startByte << 3;
s7Comm[28] = (byte)((startByte1 & 0xff0000) >> 16);//获取bit16-bit23字节,与0xff0000获得,再右移16位让它可以存在字节 大端存储
bs = BitConverter.GetBytes((ushort)(startByte1 & 0x00ffff)); //与0xffff获得低16位再获取2个字节
s7Comm[29] = bs[1];
s7Comm[30] = bs[0];
bs = BitConverter.GetBytes((ushort)(writeBs.Length * 8)); //分析报文看到规律第33(高8位)34(低8位)控制要写的bit数量
s7Comm[33] = bs[1];
s7Comm[34] = bs[0];
s7Comm.AddRange(writeBs);//添加我们要写的字节数组数据
S7TcpClient.Send(s7Comm.ToArray());//发送s7报文
Thread.Sleep(100);//等待10ms给1500CPU反应时间 实际时间根据性能自己写 或者写智能接收..我这里只提供思路
byte[] s7Result = new byte[S7TcpClient.Available];//接收了多少个字节 我们new相应的长度
S7TcpClient.Receive(s7Result);//接收字节
if (s7Result?.Length>=21&& s7Result[21]==0xff) //0xff s7协议代表着成功,咱们也加上这个判断
{
return true;
}
return false;
}
三.是骡子是马测一测
1.给DB2.DBW写个666试试
2.可以看到博图软件监控显示已写入成功
3.好了,S7协议写代码已经成功了。这里封装的是字节写包括 PLC的 8位16位32位整形和32位单精度浮点等等的写入,只不过区别是我们在上位机计算字节数组的方法不一样。
四.其实S7协议的强大之处,还可以直接操作bool。我们传统的做法是把对应的字节,字读上来,再进行与或运算再写入,这样从严谨角度上来说是不靠谱的,如modbus 40001区的操作。下期我们讲bool量怎么直接操作。
五.如果对您有帮助,请关注点赞转发,本人只是从技术角度抓包分析(告诉老铁做这个解析,桌上掉了好多头发了),仅供学习研究。
专注.NET上位机C#、主流PLC、机器视觉、电气、物联网、STM32、自动化 选型开发、终身学习欢迎交流
猜你喜欢
- 2024-10-19 IP和TCP抓包分析实验(ipv4抓包实验)
- 2024-10-19 抓包分析之蠕虫网络行为特征(蠕虫抓取软件)
- 2024-10-19 wireshark抓包工具的使用详解(wireshark抓包工具的工作原理)
- 2024-10-19 西门子S7协议抓包分析并用代码实现(二)
- 2024-10-19 玩玩抓包(七)巧用“科来”,让分析更轻松
- 2024-10-19 WireShark抓包报文结构分析(wiresharkicmp抓包分析)
- 2024-10-19 wireshark及抓包分析助力网络工程师甩锅、TCP滑动窗口机制
- 2024-10-19 SSL/TLS握手详解抓包分析(ssl握手失败是什么意思)
- 2024-10-19 记一次抓包的最基本原理(抓包程序原理)
- 2024-10-19 如何使用Wireshark捕获和分析网络数据包?
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 357℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)