Java和西门子S7-1200通讯调试记录

这是很久以前做的一个项目,工业现场一个agv,主要作用的清扫摇床(一种选矿设备),选用的S7-1200的CPU。工作原理是agv上面放一个机械臂,机械臂上面装一个扫把,到固定位置以后,执行清扫动作,模拟人工清扫。见下图:

上位软件部分,服务端采用springboot,前端使用vue。主要功能:

1:对接主控plc,下发控制指令。

2:监控设备状态,任务状态。

3:手动下发清扫任务,以及制定自动清扫任务。

软件界面见下图:

调试过程中,发现bit位写入不成功。这个通讯协议已经在其他项目上使用过了,很稳定。

  • 可能原因

西门子S7协议并不通用。万山项目上,称重的plc和散装机plc虽然都是smart200,但是订货号不同,协议稍微有一点不同。具体表现在链接的时候,一个参数不一样。

散装机PLC链接,最后一个参数为2

称重PLC链接,最后一个参数1

  • 尝试解决

程序链接云南华联PLC,从0开始测试,发现第三个参数应该为0,

清扫AGV,PLC链接代码

Plc链接成功,测试都数据没有问题,写单个字节和多个字节都没有问题。但是写一个bit不成功。

尝试解决

使用抓包工具WSexplore.exe进行抓包。对比以后的程序发现问题。

抓包工具

写位数据时实际发送的数据

程序里面对协议的解析为:

程序里面相同的位

对比以后,发现写入长度位不一致。将这个地方改成0x65,经测试,写入bit成功。

  • 总结

S7系列plc,不同plc型号,以及订货号,协议稍有不同。slot是插槽的意思,按我的理解,应该是在导轨上的位置。一遍情况下,应该都是在最左侧,就是位置0或者1。但是为什么有时候写0,有时候写1,有时候写2,完全搞不清楚,一头雾水。有知道的大佬可以帮忙指点一下,感谢。

对于写bit位,目前总结下面的几个经验:

Slot=1 或者slot =2 ,就是链接的时候最后一个参数。这个时候写位必须按长度为1

Slot=0 ,这个时候写位,长度是0x65,就是101。

相关推荐
树懒_Zz2 天前
记录 io.springfox 3.0.0 整合 spring boot 2.6.x 由于 springfox bug 引发问题
windows·spring boot·bug
每天进步一大步2 天前
webSokect安卓和web适配的Bug 适用实时语音场景
android·前端·bug·web
JWASX2 天前
【BUG记录】Apifox 参数传入 + 号变成空格的 BUG
java·bug·urlencoder·urldecoder
初遇你时动了情2 天前
解决react 路由切换,页面闪屏的bug
javascript·react.js·bug
老赵的博客2 天前
QString转const char* bug
bug
andlbds3 天前
解决PCL库中pcl::VoxelGrid降采样Bug
c++·bug
乌漆嘎嘎黑3 天前
XIO: fatal IO error 22 (Invalid argument) on X server “localhost:10.0“【小白找bug】
pytorch·python·bug·matplotlib·mobaxterm
curd_boy5 天前
【BUG】记一次context canceled的报错
golang·bug
乌漆嘎嘎黑7 天前
训练的Loss和输出突然全是nan【小白找bug】
pytorch·python·bug·llama·大模型权重文件
花开花落的个人博客7 天前
Jlink调试找出程序隐藏BUG
bug