电脑pc读写欧姆龙plc的方法
plc市场,主要还是西门子和三菱;
欧姆龙也偶尔接触;项目用到;被迫大致研究了一下它的通讯协议,不是很测底,也没找到很好的官方文档参考;
主要是对bit位的写入处理还不知道如何实现,不过好在真实项目中,对bit位大部分都是读取,很少有写入操作;
其他的plc,比如:
倍福plc,官网上有详细的demo,但是尽信书不如无书,它的sample只是介绍了单个数据点的读写,这个对于高速大量通讯来说,吃不消的;
稍微摸索一下,其实可以做成结构体或数组的批量读写;
这个功能的实现感觉非常重要:不但保证了快速批量读写,还确保了类似数据库里的事务(transaction)一致性的处理
不过最好还是有直接通讯的方法,要用它的 TWinCat作为桥梁,这不免感觉有些隔靴搔痒,交互起来不够痛快;
理论上也是有办法破解它的底层协议的,但是估计比较难,TwinCat里有个初始化连接的处理,感觉挺深奥的;没有信心去破解底层了;
还有AB,ABB plc,估计也和倍福plc类似,都是偏高级语言的套路,通讯也是有其特有的中间工具;
有一次客户使用的AB PLC;由于不懂如何和其通讯;逼着客户拆掉换成了西门子1200;
估计以后西门子也会转成倍福的这种方式;可能就废掉S7协议,到时候估计就没能力破解它的底层协议了;
只能老老实实用他们自身的中间件,好在工控领域不想互联网那么日新月异;还可以让老家伙们继续折腾一段时间;
其实plc的协议已经算复杂的了;其他设备,比如电子标签(dps),接触过的所有厂家的协议都轻松的破解了,因为协议特别简单,
否者要用他们自带的dll 这类东西,感觉有点不靠谱,总怀疑他们的开发包有漏洞;或者性能处理上有不优化的地方;
就跟厨师做菜一样,最好原味为主;健康安全;
其他一些小众设备的控制,比如led显示屏,简单监控了通讯内容,感觉也能破解,
只是由于:
1.显示屏厂家太多,不可能每个不同项目中用到的不同的led,都去破解底层协议;没那个精力;
2.毕竟显示屏只是一个显示作用,不像plc的高速通讯那么重要;
3. 还是要尊重一下厂家,什么都去破解,感觉什么都想撕破别人的衣服,有点不太道德; 但是plc太重要,受到opc这样的约束也是如鲠在喉;
欧姆龙pc大致模式的结果如下:
1.大致特点:
a.. socket方式; 需要ip和端口号;通过TCP模式通讯,2进制方式;
b. 有一个初始化的步骤,也就是socket刚刚连接上的时候,需要做个初始化的步骤;
3. 初始化正常后,可以进行db块的读写操作;
2.和三菱,西门子PLC的差别;
感觉上,相对西门子和三菱,协议相对稍微更简单一些,也更合理一点;
体现在: 1. 解析从大到小,程序和阅读都方便一些(和西门子一致)
2. 按字读写,效率更高(和三菱一致)
3. 有握手,但只有一次,比西门子两次握手简单,也比三菱增加了安全机制;
4. 不同型号协议基本一致,不像三菱老款的fx和q系列有两套协议,也不像西门子
不同型号的槽号有区别;
5. 好像只有16进制的通讯方式,没有ascii那种模式;和西门子一样,这样比较干净;不像三菱两种模式都支持,反而让上位机和电控之间每次沟通到底用那种模式而浪费时间;
6. 端口像三菱那样1对1,但是可以定义多个; 不像像西门子那样固定102端口,但是可以1对多; 这样对开发人员要求低一些; 端口1对多控制,如果程序写不好,容易出问题;
3.初始化问答格式;
a.连接成功后发送握手命令
在连接的情况下,握手命令只能发送一次,否则将返回异常帧
b. 比如 电脑pc的ip是:192.168.1.254; plc的ip是:192.168.1.253
PC ->PLC(电脑发给plc初始化指令 20个字节):
46 49 4E 53 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 FE
PLC 回复:
46 49 4E 53 00 00 00 10 00 00 00 01 00 00 00 00 00 00 00 FE 00 00 00 FD
解析:
PC ->PLC(电脑发给plc初始化指令):
46 49 4E 53 -- 头说明,翻译成ASCII就是FINS
00 00 00 0C -- 整个报文长度0C(16进制)= 12;
00 00 00 00 -- 初始化握手命令代码( 客户端->服务端,也就是PC给PLC发送初始化命令) ;
00 00 00 00 -- 错误代码
00 00 00 FE -- 上位机电脑IP号: FE(16进制)=254 表示电脑的ip:192.168.1.254 中最后的254;
PLC 回复:
46 49 4E 53 -- 头说明,翻译成ASCII就是FINS
00 00 00 10 -- 整个报文长度10(16进制)= 16;
00 00 00 01 -- 初始化握手命令代码回复( 服务端->客户端) ;
00 00 00 00 -- 错误代码
00 00 00 FE -- 上位机电脑IP号: FE(16进制)=254 表示电脑的ip:192.168.1.254 中最后的254;
00 00 00 FD -- PLC的IP号: FD(16进制)=253 表示电脑的ip:192.168.1.253 中最后的253
以上交互完成后,可以安心的做后续的读写交互了;
如果后续读写过程中,一问一答有问题,就把socket通讯断掉,重新做握手;
所以,我们在设计的时候,可以把握手这个操作做在Socket的onConetced 里面;
4.读操作:
比如PC读取:WR.10 开始的一个点( WR-数据类型, 10--启始地址 )
PC ->PLC(电脑发给plc读取指令 34个字节) :
46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 FD 00 00 FE
00 FF 01 01 82 00 0A 00 00 01
PLC反馈:
46 49 4E 53 00 00 00 18 00 00 00 02 00 00 00 00 C0 00 02 00 FD 00 00 FE
00 FF 01 01 0000 4013
解析:
PC ->PLC(电脑发给plc读取指令):
46 49 4E 53 -- 头说明,翻译成ASCII就是FINS
00 00 00 1A -- 整个报文长度1A(16进制)= 26
00 00 00 02 -- 功能码,发送命令
00 00 00 00 -- 错误代码
80 00 02 00 -- 80 表示 ICF; 00表示RSV 02表示GCT, 00表示PLC网络号
FD 00 00 FE -- FD--的ip最后部分,00--plc单元号 00--pc网络号 FE--PC的IP最后部分
00 FF 01 01 -- 00--pc单元号 FF--SID 01-- MRC命令 01--SRC命令(后面0101表示读)
82 -- CIO-80,DM-82,WR-B1
00 0A -- 启始地址
00 --如果有位,就是位的首地址
00 01 -- 读取长度
PLC反馈:
46 49 4E 53 -- 头说明,翻译成ASCII就是FINS
00 00 00 18 -- 整个报文长度18(16进制)= 24
00 00 00 02 -- -- 功能码,发送命令
00 00 00 00 -- 错误代码
C0 00 02 00 - C0对应上面80 ,表示回复的意思;
FD 00 00 FE - FD--的ip最后部分,00--plc单元号 00--pc网络号 FE--PC的IP最后部分
00 FF 0101 --不管它,固定的
0000 --(0000表示接受正常)
4013 --收到的一个字的数据;
5.写操作:==========================
比如PC写入:WR.10 =100
PC ->PLC(电脑发给plc写入指令) :
46 49 4E 53 00 00 00 1C 00 00 00 02 00 00 00 00 80 00 02 00 FD 00 00 FE
00 FF 01 02 82 00 0A 00 00 01 00 64
PLC反馈:
46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 C0 00 02 00 FD 00 00 FE
00 FF 01 02 00 00
========================
解析:
PC ->PLC(电脑发给plc初始化指令):
46 49 4E 53 -- 1. 头说明,翻译成ASCII就是FINS
00 00 00 1C -- 2. 1A表示读取,1C表示 写入 1C-1A=2个字节的数据;
00 00 00 02 -- 3. 功能码,发送命令
00 00 00 00 --4. 错误代码
80 00 02 00 -- 5. 80 表示 ICF; 00表示RSV 02表示GCT, 00表示PLC网络号
FD 00 00 FE -- 6. FD--的ip最后部分,00--plc单元号 00--pc网络号 FE--PC的IP最后部分
00 FF 01 02 -- 7. 00--pc单元号 FF--SID 01-- MRC命令 02--GCT命令(后面0102表示写)
82 --8. CIO-80,DM-82,WR-B1
00 0A -- 9. 启始地址
00 --10. 如果有位,就是位的首地址
00 01 -- 11. 写入长度
00 64 --12. 写入值;
========================
PLC反馈:
46 49 4E 53 -- 头说明,翻译成ASCII就是FINS
00 00 00 16 --长度
00 00 00 02 ---- 功能码,发送命令
00 00 00 00 -- 错误代码
C0 00 02 00 --回复;
FD 00 00 FE -- FD--的ip最后部分,00--plc单元号 00--pc网络号 FE--PC的IP最后部分
00 FF 01 02 -- 00--pc单元号 FF--SID 01-- MRC命令 02--GCT命令
00 00 --表示写入正常;
具体对应关系,请参见下表:
暂无评论