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。

相关推荐
0白露1 天前
关闭搜狗输入法右下角广告,可以适用于大多数应用系统通知的广告
windows·bug
一只自律的鸡2 天前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
Lichenpar3 天前
Springboot采用FastJson2作为MessageConverter时,配置的全局日期类型序列化转换BUG
java·开发语言·bug
Irene19914 天前
AI 找 bug 的局限性 和 Deepseek 优势明显
bug
癫狂的兔子5 天前
【bug】【Python】pandas中的DataFrame.to_excel()和ExcelWriter的区别
python·bug
癫狂的兔子5 天前
【BUG】【Python】【Spider】Compound class names are not allowed.
开发语言·python·bug
netkiller-BG7NYT5 天前
阿里云语音合成CosyVoice重大BUG被我发现了
bug
马猴烧酒.6 天前
【Mybatis出现bug】应为 <statement> 或 DELIMITER,得到 ‘id‘
java·bug·mybatis
请叫我大虾6 天前
发现一个jdk中ArrayList的小BUG
android·java·bug
离离茶6 天前
【笔记1-10】Qt bug记录:dockwidget通过raise在最前面显示,toolbar的拓展菜单失效
笔记·qt·bug