版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

一、 说明

欧姆龙包括网口和串口两种通讯方式

欧姆龙PLC通常包括网口和串口两种通讯方式

  • 网口,其中通过网络通讯的协议有两种:Fins/TCP和Fins/UDP。我们目前的驱动仅支持:Fins/TCP网络方式,不支持Fins网口,通常是CP1H以太网。协议:
  • Fins/TCP
  • FINS/UDP
    • 和FINS/UDP方式相比,FINS/TCP具有更好的可靠性,但是不如前者的效率高
    • 电脑和PLC通讯,通常都是电脑做为客户端,PLC作为服务器端
  • 串口。通过PLC上的DB9针串口接入,但线序和普通的DB9针不同,所以用普通的USB转DB9的线接到PLC是无效的串口

      协议为:

      Fins-tcp

      《omron驱动》该驱动通讯方式为串口。

      通讯方式:串口连接

      实现了各种数据块的读,但未实现写。

        • 串口和网关接入的线序图例:
        • PLC DB9串口和USB转DB9(公头)线接入图例:


      驱动名称:bin/drivers/omrondriveromronfinsdrv/ omrondriveromronfinsdrv.exe

      ...

      驱动配置

      在驱动中,增加一个名称和模块名称均为omrondriver的驱动。内置驱动,不需要增加和配置。

      三、 设备配置

      在驱动omrondriver下增加一个设备,

      设备配置

      对于通过网口的欧姆龙PLC:

      在驱动omronfinsdrv下增加一个设备,如ormon1

      CJ2M等具有网络,进行网口配置

      • 连接方式选择:tcp客户端
      • IP:PLC的网口 的IP地址,如不知道可以参考欧姆龙PLC编程软件说明,通过USB连上去查看或修改
      • 端口:缺省为9600
      • 其他参数:不需要配置
      • 参数1:单元号,缺省为0
      • Image Added

      接入串口(如CP1E,接入DB9针串口),进行串口配置

      • 连接方式选择:serial。实际上时RS232连接方式选择:serial
      • 波特率:按照欧姆PLC CX-P所配置大小,默认9600
      • 一般默认配置偶校验,数据位7,停止位2
      • 如下 parity=even;databits=7;stopbits=2
      • param1配置单元站号 由PLC决定
      • 最终以PLC给出的参数为准,可以通过欧姆龙PLC连接到PLC,看到:
      • Image Added

      四、 变量配置

      增加变量所需要配置的属性

      ...

      设备:选择刚刚配置的设备

      周期:根据需要而定,缺省为1秒

      可控制:使能


      寄存器长度说明:

      • 地址是数据的第一个字节的起始地址,数据长度取决于eview的数据类型,通常是:
        • 1位(bool类型)
        • 1个字节(uchar,char)
        • 2个字节(uint16,int16)
        • 4个字节(int32,uint32,float)
        • 8个字节(double)
      • 寄存器中除IR类型以4个字节为单位
      • 其余都是以字(2个字节为单位)
      • 寄存器地址从0开始,如D:0
      • 其中:CIO、WR、HR、AR、DM可以按位获取数据或控制,其他类型不能按位控制,但可以按位获取数据。按位获取的位序号从0到15

      常用寄存器有:

      • DM
      • CIO,单位:字(2个字节)。
        • eview地址按字节或双字示例:CIO:30,CIO数据块的第30个数据。数据长度取决于eview的数据类型。
        • eview按位取示例:CIO:30.1,CIO数据块的第30个数据的第2位。最小位0,最大位15。数据长度取决于eview的数据类型,按位必须是BOOL。
      • WR,HR,AR,PV,CF,IR,DR,EM

      ...

      • DM:10  CIO:30   WR:10  HR:100

      PLC数据类型和eview数据类型的对应关系

      PLC数据类型eview数据类型说明

      int32

      uint32


















      • DM数据区域,变量地址示例:
        • 按字:D20,D:20,数据类型:参考上表
        • 按位:D20.1,D:20.1, 数据类型:通常bool
      • CIO,通用IO寄存器。地址示例:
        • 按字:CIO20, CIO:20,数据类型:参考上表
        • 按位:CIO20.1, CIO:20.1, 数据类型:通常bool
      • HR,保持寄存器。地址示例:
        • 按字:H20, H:20,数据类型:参考上表
        • 按位:H20.1, H:20.1, 数据类型:通常bool
      • WR,工作内存区。地址示例:
        • 按字:W20, W:20,数据类型:参考上表
        • 按位:W20.1,W:20.1, 数据类型:通常bool
      • AR,辅助寄存器。地址示例:
        • 按字:A20, A:20,数据类型:参考上表
        • 按位:A20.1,A:20.1, 数据类型:通常bool

      错误处理

      • log日志在握手中返回了错误码:36(0x24)。查询下表,得到错误信息为:相同的FINS节点地址已经被使用。

        • 这个意思是说,客户端地址码在服务端已经注册了。客户端地址码应该是IP的最后1段,服务端已经登记了这段IP给其他客户端使用

        • 解决方法:程序中握手返回错误码时,会自动重新生成1个客户端码,这样总能遇到1个未登记在服务端的客户端码
      • log日志下面是正常的提示,不是错误: [INFO][2424] **************成功解析一个完整包,握手返回,返回的客户端地址:197 ,服务端地址:15!(设备名:YPLC15,块名:CIO_group_17, 事务号:31597)
      • log提示错误,读取不到数据:[ERROR][29fc] 收到读写响应包, 操作号:257, 操作结果:64<>0(设备名:YPLC12,块名:D_group_15, 事务号:1)
        • 查询通信文档英文版,这个64=0x40=01000000,该位表示的可能是:1: Special I/O Unit error

      ...

      模拟

      安装官方CX-Simulator,CX-Programer,可以模拟数据。

      ...

      注意:测试是,不能让CX-Simulator Run起来,否则会将PLC中数据都置0,导致无法修改数据进行测试。PLC/操作模式应该处于调试状态,不要点击“运行”,否则会强制清空数据。

      ...


      驱动读取不到错误FAQ


      FINS-TCP协议分析

      参考:http://blog.sina.com.cn/s/blog_539cee190102wr4t.html

      功能码表:

      Image Added

      一,握手命令

      1、客户端向服务器发送命令00000000。这个命令长20字节,分成5组4字节。分别是:
      头(FINS) + 长度(Hex0C) + 命令(00000000)+ 错误码(00000000) + 客户机节点地址。
      46494E53是FINS的ASCII码值,即命令头。
      0000000C是命令长度20。
      00000000是命令码。
      00000000是错误码。
      00000005是客户节点地址,即电脑IP地址的末位。
      http://blog.sina.com.cn/hulx
      在发送区输入:
      46494E53 0000000C 00000000 00000000 00000005
      点击发送,PLC立即回应:
      46494E53 00000010 00000001 00000000 00000005 00000020客户机节点地址(这个地址可以是IP后几位,也可以是随机数或固定数。但要保证和其他客户端不冲突)。
      46 49 4E 53是FINS的ASCII码值,即命令头。
      在发送区输入:
      46 49 4E 53 00 00 00 0C 00 00 00 00 00 00 00 00 00 00 00 05

      头(FINS:46 49 4E 53) + 长度(Hex0C,20字节) + 命令(00 00 00 00)+ 错误码(00 00 00 00) + 客户机节点地址(00 00 00 05),电脑IP地址192.168.0.05的最后一段hex,也可以是任意值)。


      2、这个是服务器端(PLC)向客户端(电脑)发送: 

      46 49 4E 53 00 00 00 10 00 00 00 01 00 00 00 00 00 00 00 05 00 00 00 20

      头(FINS: 46 49 4E 53)+ 长度(24字节-8头,Hex10:00 00 00 10) + 命令(00 00 00 01) + 错误码 (00 00 00 00)+ 客户机节点地址 (00 00 00 05)+ 服务器地址(00 00 00 20)
      上面的命令错误代码为0,客户端ip地址05已被服务器32(hex20)成功记录。
      如果发生错误,服务器回应的命令会包含错误码,连接断开,端口立刻关闭。当连接建立之后,不要再次发送这个命令,否则服务器会返回03错误码,即不支持的命令。全部的错误代码如下:2、这个是服务器端(PLC)向客户端(电脑)发送的命令00000001。这个命令长24字节,分成6组4字节。分别是:
      头(FINS)+ 长度(Hex10) + 命令(00000001) + 错误码 + 客户机节点地址 + 服务器地址。
      上面的命令错误代码为0,客户端ip地址05已被服务器32(hex20)成功记录。
      http://blog.sina.com.cn/hulx
      如果发生错误,服务器回应的命令会包含错误码,连接断开,端口立刻关闭。当连接建立之后,不要再次发送这个命令,否则服务器会返回03错误码,即不支持的命令。全部的错误代码如下:
      http://blog.sina.com.cn/hulx
      十六进制错误码   含义
      00000000           正常
      00000001           头不是‘FINS’ (ASCII code)。
      00000002           数据太长。
      00000003           不支持的命令。
      00000020           所有的连接被占用。
      00000021           制定的节点已经连接。
      00000022           未被指定的IP地址试图访问一个被保护的节点。
      00000023           客户端FINS节点地址超范围。
      00000024           相同的FINS节点地址已经被使用。
      00000025           所有可用的节点地址都已使用。

      二、FINS帧发送命令
      如果向服务器发送FINS帧,就要用到这个命令。由于FINS帧长度是12-2012,因此命令长度可变,
      头(FINS)+长度+命令(00000002)+错误码+FINS帧。

      FINS命令帧内容可参考欧姆龙OMRON PLC之HostLink通讯协议-FINS命令W字/位操作篇,里面有存储区代码和操作代码的内容。
      http://blog.sina.com.cn/hulx
      例2-1、读DM0开始的2个通道:
      发送:
          46494E53 0000001A 00000002 00000000 80000200 20000005 00FF0101 82000000 000246 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 80 00 02 00 20 00 00 05 00 FF 01 01 82 00 00 00 00 02

      头(46 49 4E 53)+负载长度(26字节,00 00 00 1A)+命令(00 00 00 02:读)+错误码(00 00 00 00

      +ICF(80)+RSV(00) + GCT(02) + DNA(00)+目标地址(20 )+00 00+原地址(05)+SN2(00)+事务号(FF)

      +读操作(01 01)+DM存储区代码(82)+起始地址(00 00 00)+数量( 02 02)
      20000005:20是目标地址,05是源地址;
      00FF0101 :0101是读操作;
      82000000:82是DM存储区代码,000000是起始地址;
      0002:是数量。

      http://blog.sina.com.cn/hulx
      返回:
         46494E53 0000001A 00000002 00000000 C0000200 05000020 00FF0101 00001234 5678
      返回:34个字节
       46 49 4E 53 00 00 00 1A 00 00 00 02 00 00 00 00 C0 00 02 00 05 00 00 20 00 FF 01 01 00 00 12 34 56 78
       头(46 49 4E 53)+负载长度(26字节,00 00 00 1A)+命令(00 00 00 02:读)+错误码(00 00 00 00)+??(C0 00 02 00)+目标地址(05 00)+原地址(00 20 )+??(00 FF )+读操作(01 01)+操作结果(00 00 )+D0的Hex值(12 34)+D1的值(56 78
      00001234:0000代表操作成功,1234是读回的第一个字,即D0=Hex1234,
       5678:D1=Hex5678

      例2-2、W210寄存器写入Hex0388:
      发送:
         46494E53 0000001C 00000002 00000000 80000200 20000005 00FF0102 B100D200 00010388
      20000005:20是目标地址,05是源地址;
      00FF0102:0102是写操作代码;
      B100D200:B1是W字代码,00D2是起始地址,Hex00D2=212,;
      00010388:是写入数量,0388是写入首个内容;

      回应:
         46494E53 00000016 00000002 00000000 C0000200 05000020 00FF0102 0000
      0102后面紧跟的0000代表写入成功。
      http://blog.sina.com.cn/hulx
      例2-3、W210寄存器读取:
      发送:
         46494E53 0000001A 00000002 00000000 80000200 20000005 00FF0101 B100D200 0001
      20000005:20是目标地址,05是源地址;
      00FF0101:0101是读操作代码;
      B100D200:B1是W字代码,00D2是起始地址,Hex00D2=212,;
      0001:是读取数量。
      http://blog.sina.com.cn/hulx
      回应:
         46494E53 00000018 00000002 00000000 C0000200 05000020 00FF0101 00000388
      0102后面紧跟的0000代表读取成功,W210=Hex0388
      http://blog.sina.com.cn/hulx
      例2-4、强制W212.01=On:
      发送:
         46494E53 0000001C 00000002 00000000 80000200 20000005 00FF2301  00010001 3100D401
      20000005:20是目标地址,05是源地址;
      00FF2301:2301是强制操作代码;
      00010001:前面的0001是数量,后面的0001代表强制置位操作;
      3100D401:31是W位代码,00D401是起始地址,Hex00D446 49 4E 53 00 00 00 1C 00 00 00 02 00 00 00 00 80 00 02 00 20 00 00 05 00 FF 23 01  00 01 00 01 31 00 D4 01
      20 00 00 05:20是目标地址,05是源地址;
      00 FF 23 01:2301是强制操作代码;
      00 01 00 01:前面的0001是数量,后面的00 01代表强制置位操作;
      31 00 D4 01:31是W的位代码,00D401是起始地址,Hex00D4.01=212.01。
      http://blog.sina.com.cn/hulx
      回应:
         46494E53 00000016 00000002 00000000 C0000200 05000020 00FF2301  000046 49 4E 53 00 00 00 16 00 00 00 02 00 00 00 00 C0 00 02 00 05 00 00 20 00 FF 23 01  00 00
      2301后面紧跟的0000表示操作成功。


      例2-5、强制W212.01=Off:
      发送:
         46494E53 0000001C 00000002 00000000 80000200 20000005 00FF2301  00010000 3100D401
      20000005:20是目标地址,05是源地址;
      00FF2301:2301是强制操作代码;
      00010000:0001是数量,0000代表强制复位操作;
      3100D401:31是W位代码,00D401是起始地址,Hex00D446 49 4E 53 00 00 00 1C 00 00 00 02 00 00 00 00 80 00 02 00 20 00 00 05 00 FF 23 01  00 01 00 00 31 00 D4 01
      20 00 00 05:20是目标地址,05是源地址;
      00 FF 23 01:2301是强制操作代码;
      00 01 00 00:0001是数量,00 00代表强制复位操作;
      31 00 D4 01:31是W位代码,00 D4 01是起始地址,Hex00D4.01=212.01。
      回应:
         46494E53 00000016 00000002 00000000 C0000200 05000020 00FF2301  0000
      2301后面紧跟的0000表示操作成功。
      http://blog.sina.com.cn/hulx
      例2-6、取消W212.01强制:
      发送:
         46494E53 0000001C 00000002 00000000 80000200 20000005 00FF2301  0001FFFF 3100D401
      20000005:20是目标地址,05是源地址;
      00FF2301:2301是强制操作代码;
      0001FFFF:0001是数量,FFFF代表取消强制操作;
      3100D401:31是W位代码,00D401是起始地址,Hex00D4.01=212.01。
      http://blog.sina.com.cn/hulxhttp://blog.sina.com.cn/hulx
      回应:
         46494E53 00000016 00000002 00000000 C0000200 05000020 00FF2301  0000
      2301后面紧跟的0000表示操作成功。
      注意在CX-Programmer查看窗口中W212.01的值0后面的(强制)字样不见了,表示已经成功地取消了强制。

      ...


      FINS-串口协议分析

      串口通信格式:起始标记@,unitNo,HeaderCode(FA,1个字节),ResponseTime(2,1个字节), ICF(00,1个字节),DA2(00,1个字节),SA2(00,1个字节),SID(可当做事务号用,1个字节), FINScommandCode(读写命令号,1个字节),Text(请求或应答内容区),FCS(FCS验证码),*

      Unit No:单元号,对应PLC内置串口或串行通讯单元设置的Hostlink单元号.缺省为0
      Header code:在PC主机直连PLC的情况下,头代码为FA
      Response wait time:设置范围为0~F,单位为10ms,例如设置为2,则响应等待时间为20ms
      ICF、DA2、SA2:在PC主机直连PLC的情况下,固定为00
      Fins command code:参考Fins通讯手册P125,读命令:0101; 写命令:0102
      Text:具体操作内容,读写区域、读取起始地址、数据长度等内容

      FCS校验码,1个字节

      帧结束标志*


      • 读取D0开始1个通道的值(1个WORD):

      请求:@00FA00000000001018200000000017C*

      说明:@(起始代码) 00(PLC单元号)  FA(头部代码)  00(响应时间) 00(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0101(读取功能码) 【82(DM区) 0000(起始地址0) 00(通道中的第几位) 0001(读取1个寄存器)】 7D(校验码)*(结束标记)

      返回:@00FA004000000001010000123447*

      说明:@(起始代码) 00(PLC单元号) FA(头部代码) 00(响应时间) 40(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0101(读取功能码)  0000(返回状态?) 1234(读取到的1个字)  47(校验码)*(结束标记)


      • 读取W10开始的8个通道:

      请求:@00FA00000000001018200000000017C*

      说明:@(起始代码) 00(PLC单元号) FA(头部代码) 00(响应时间) 00(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0101(读取功能码) 82(DM区) 0000(起始地址) 00(通道中的第几位) 0001(读取1个通道) 7C(校验码)*(结束标记)

      返回:@00FA00400000000101000011112311AAAADDDDFFFF12323243A12337*

      说明:@(起始代码) 00(PLC单元号) FA(头部代码) 00(响应时间) 40(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0101(读取功能码)  0000(返回状态?) 11112311AAAADDDDFFFF12323243A123(读取到的16个字)  37(校验码)*(结束标记)


      • 读取W区的一个位W20.5:???


      • 写W20开始的5个通道

      请求:@00FA0000000000102B100140000050001000200030004000506*

      说明:@(起始代码) 00(PLC单元号) FA(头部代码) 00(响应时间) 00(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0102(写入功能码) B1(WR区) 0014(起始地址) 00(通道中的第几位) 0005(写入5个字到通道)00010002000300040005(写入的值,5个字) 06(校验码)*(结束标记)

      返回:@00FA00400000000102000040*

      说明:@(起始代码) 00(PLC单元号) FA(头部代码) 00(响应时间) 40(ICF) 00(DA2) 00(SA2) 00(SID,事务号)  0102(写入功能码)  0000(返回状态?) 40(校验码)*(结束标记)


      • 写W20.5开始的第6位


      FINS-UDP协议分析


      • UDP访问方式:
      • 读取示例:读取DM区20个字, 从DM100H开始
        命令:80 00 02 00 41 00 00 0B 00 00 01 01 82 00 64 00 00 14
        说明:
        80 00 02       固定帧头
        00 41 00       设备的网络号,节点号,单元号
        00 0B 00       PC的网络号,节点号,单元号
        00 01 01        SID+MRC+SRC
        82 表示DM区
        00 64 首地址
        00 固定
        00 14 读取数量
      • 响应: D100=0x1388, D101=0x1770, D102=0x1b58
        c0 00 02 00 0b 00 00 41 00 00 01 01 00 00 13 88 17 70 1b 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        说明:
        C0 00 02    固定帧头
        00 0B 00     PC网络号,节点号,单元号
        00 41 00     设备网络号,节点号,单元号
        00 01 01     SID+MRC+SRC
        00 00
        数据区:
         13 88 17 70 1b 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


      FINS TCP通讯手册与文档资料

      FINS 串口文档资料