文章

CAN-CBX-DIO8 快速入门

共8个数字IO口,均可单独被配置为输出口或者输入口

IO口电源接线示意图

以下电源接线示意图可以防止端口作为OUTPUT时供电不足引发 LED "V" 灯报警的情形发生。

连线与配置

  1. 设置模块的拨盘至 High=0,Low=1,Baud=0,其含义为Node-ID设为1,波特率设为1000 Kbit/s。
  2. 建立一个最简单的CAN总线,一端通过esd CAN的界面卡(CAN-PCIe/402-1)或者CAN USB装置(CAN-USB/3-FD)连接至Win10 PC,另一端连接至此产品CAN-CBX-DIO8。具体连线方法可以参考Wiring
  3. 在Win10 PC端,打开esd COBview软件工具。COBview使用方法请参见COBview。Net选择CAN界面卡或者CAN USB装置所对应CAN口,Bitrate选择1000kbit/s,然后点击Find Modules按钮,CAN-CBX-DIO8会被显示在COBview中。
  4. 在COBview中点击Start按钮,使得CANopen网络进入NMT Operational状态。

试验一:

将8个口都设置为Output,并且使用SDO的方式开启第一、第二和第三口的Output,使此三口输出24V电压。

  1. Index 2250 sub 1 的值定义了DIO8中的8个口哪几个用来做Output,哪几个用来做Input。它是一个Unsigned 8格式数据,8位中每一位都对应一个IO口。置1用作output,置0用作Input。
  2. 使用COBview来把Index 2250的值改为0xFF,也就是把所有8个IO口都用作Output。在"Index(Hex):"栏位中输入2250,点击"Read"按钮,读取上来数据后,双击sub 1,在"Value"栏位输入0xFF,然后点击"Write"按钮写入数据。
  3. Index 6200 sub 1 的值定义了DIO8中的8个口是否有开启Output 24V,如果开启了Output的话,对应口的指示灯会亮起来。它是一个Unsigned 8格式数据,8位中每一位都对应一个IO口。置1用作开启output,置0用作关闭Output。
  4. 使用COBview来读取6200的值。在"Index(Hex):"栏位中输入6200,点击"Read"按钮,读取上来数据后,双击sub 1,在"Value"栏位输入7(意思是打开第一,第二,第三口的output),点击"Write"按钮。
  5. 写入成功后,可以查看CAN-CBX-DIO8装置,1,2,3上的指示灯都亮起了。

试验二:

配置CAN-CBX-DIO8的RxPDO,并使用RxPDO的方式来开启第五、六、七、八口的Output。

  1. 使用COBview读取Index 1400(Receive PDO Communication Parameter)的值。sub 1的值若为0x201,则表示此CAN-CBX-DIO8会接收CAN网络中CAN-ID为0x201的数据。当然你也可以把sub 1改成其他你想用的CAN-ID值。
  2. 使用COBview读取Index 1600(Receive PDO Mapping Parameter)。其中sub 0的值为1表示只有后续只有sub 1有效,sub 1的值为0x62000108,含义为当CAN-CBX-DIO8收到的RxPDO时,会将数据中第一个8 bit也就是1 byte的数据,写入字典Index 6200 sub 1中去。
  3. 先确认是否所有端口都被用作Output口,参见试验一。使用CANreal发送CAN ID为0x201,数据为1 byte的0xF0的CAN消息。查看CAN-CBX-DIO8,第五、六、七、八口的灯都被点亮了,说明这四个口开启了Output 24V。

试验三:

CAN-CBX-DIO8每隔1秒钟发送一次SYNC message, SYNC message ID设为0x80。

  1. 初始状态下,CAN-CBX-DIO8不会发送SYNC message。用COBview读取Index 1005(COB-ID SYNC Message),一般初始数据为0x80,将其修改为0x40000080,并写入数据。
  2. 使用COBview读取Index 1006(Communication Cycle Period),一般初始数据为0,将其修改为0x000F4240(1,000,000 micro-seconds),并写入数据。
  3. 使用CANreal工具读取CAN总线数据,总线上应每隔1秒会有CAN-ID为0x80的消息。

试验四:

将8个口都设置为Input,然后在第一口上接个硬件开关,由开和关状态变化所引起的TxPDO的传送。并且测试不同的TxPDO transmission type。

PDO Transmission types used by Index 1800
• acyclic, synchronous: The transmission is initiated if a SYNC-message has been received (PDO-transmission type 0) and data has changed.
• cyclic, synchronous: The transmission is initiated if a defined number of SYNC-messages have been received (PDO-transmission type 1...240).
• synchronous, remote request: The state of the inputs is latched with each SYNC-message and is transmitted after the reception of a RTR-frame (PDO-transmission type 252).
• asynchronous, remote request: After the reception of a RTR-frame the last latched state of the inputs is transmitted (PDO-transmission type 253).
• event controlled, asynchronous: The transmission is initiated if the state of selected inputs has changed (PDO-transmission type 254, 255)
  1. 使用COBview来把Index 2250的值改为0,也就是把所有8个IO口都用作Input。在"Index(Hex):"栏位中输入2250,点击"Read"按钮,读取上来数据后,双击sub 1,在"Value"栏位输入0,然后点击"Write"按钮写入数据。
  2. 使用COBview读取Index 1800(Object Transmit PDO1 Communication Parameter)。sub 1的值为0x181,含义为CAN-CBX-DIO8发送的TxPDO的CAN ID为0x181,用户也可以改为其他的CAN ID。
  3. Index 1800 sub 2(TxPDO transmission type)的初始值为0xFF,含义为event controlled,结合sub 5(event timer)的设置有如下表现 (a) 当event timer设为0时,也就是当Input状态变化时会发送TxPDO。断开和接通开关测试一下,在CANreal中抓取CAN总线消息,会有CAN-ID为0x181,数据为00(所有口都断开)或者01(第一口接通)消息发出。 (b) 当evert timer设置不为0时,如设为0xBB8(3000 ms),Input状态会由TxPDO每隔3秒钟向CAN总线发送一次。
  4. Index 1800 sub 2(TxPDO transmission type)的值改为0,含义为当Input状态变化了,之后又收到了SYNC message时,会发送TxPDO。改变一下开关的状态,然后使用CANreal发送一条CAN ID为0x80且不带任何数据(Len:0)的CAN消息后,会有CAN-ID为0x181,数据为00(所有口都断开)或者01(第一口接通)消息发出。
  5. Index 1800 sub 2(TxPDO transmission type)的值改为3,含义为当收到3条SYNC message后,会发送TxPDO,而不论Input状态是否有改变。使用CANreal发送三条CAN ID为0x80且不带任何数据(Len:0)的CAN消息后,会有CAN-ID为0x181,数据为00(所有口都断开)或者01(第一口接通)消息发出。
  6. Index 1800 sub 2(TxPDO transmission type)的值改为0xFC(252),含义为当收与TxPDO CAN ID相同的RTR消息后,会发送TxPDO,而Input状态只有在收到SYNC message之后才会刷新,也就是说如果没收到SYNC message的话,Input状态就一直不会刷新,即使硬件的开关已经断开或者接通过。按照如下步骤进行测试。 (a) 将硬件开关设为断开状态。 (b) 使用CANreal发送一条CAN ID为0x181的RTR CAN消息后,会有CAN-ID为0x181,数据为00消息发出。 (c) 将硬件开关设为接通状态。 (d) 使用CANreal发送一条CAN ID为0x181的RTR CAN消息后,会有CAN-ID为0x181,数据仍为00消息发出。 (e) 使用CANreal发送一条CAN ID为0x80且不带任何数据(Len:0)的CAN消息, (f) 然后再发送一条CAN ID为0x181的RTR CAN消息后,会有CAN-ID为0x181,数据为01消息发出。此时Input状态已经更新为接通状态。
  7. Index 1800 sub 2(TxPDO transmission type)的值改为0xFD(253),含义为当收与TxPDO CAN ID相同的RTR消息后,会发送TxPDO,而不论Input状态是否有改变。使用CANreal发送一条CAN ID为0x181的RTR CAN消息后,会有CAN-ID为0x181,数据为00(所有口都断开)或者01(第一口接通)消息发出。

试验五:

使用同一个RxPDO(如ID 0x211),内嵌两个bytes的数据,同时控制两个DIO8装置的Output。配置两个装置前请参考CiA DS301 7.5.2.36章节Object 1600h to 17FFh: RPDO mapping parameter中关于re-mapping procedure,和7.5.2.35章节 Object 1400h to 15FFh: RPDO communication paramete所述内容

  1. 配置第一个DIO8装置 (a) 读取其Index 1400,将sub index 1的值改为0x80000211 (b) 读取其Index 1600,将sub index 0的值改为2 (c) 读取其Index 1400,将sub index 1的值改为0x00000211 (d) 读取其Index 2250,将sub index 1的值改为0xff

  2. 配置第二个DIO8装置 (a) 读取其Index 1400,将sub index 1的值改为0x80000211 (b) 读取其Index 1600,将sub index 0的值改为0,将sub index 1的值改为00050008,将sub index 2的值改为62000108 (c) 读取其Index 1600,将sub index 0的值改为2 (d) 读取其Index 1400,将sub index 1的值改为0x00000211 (e) 读取其Index 2250,将sub index 1的值改为0xff

  3. 通过CANreal软件发送一条RPDO (ID: 0x211, Length: 2, Byte1: 0xFF, Byte2: 0x43),查看第一个DIO8,应该所有OUTPUT指示灯都亮了,第二个DIO8中第1,2,7的指示灯亮了。

试验六:

配置Node ID为1的CAN-CBX-DIO8成为heartbeat producer,每隔3秒钟发一次心跳消息到总线上。配置Node ID为2的CAN-CBX-DIO8成为监视Node ID 1的heartbeat consumer。

  1. 使用COBview,将Module No.改为1表示操作Node ID为1的CAN-CBX-DIO8。读取Index 100E(Node Guarding Identifier)的值,初始值为0x701,此CAN ID为此CAN-CBX-DIO8发送heartbeat消息所用的CAN ID。
  2. 使用COBview读取Index 1017(Producer Heartbeat Time)的值,初始值为0, 将其改为0xBB8(3000 ms)。
  3. 使用CANreal读取CAN总线,会看到每隔3秒钟,有一条CAN ID为0x701的CAN消息发出。消息数据为1个字节,用来表示此CAN-CBX-DIO8当前的状态,如05表示operational状态,7F表示PreOp状态,04表示Stop状态。用户可以使用COBview,点击Start(Operational),PreOP,Stop按钮切换装置的状态,并查看此状态数据的变化。
  4. 使用COBview,将Module No.改为2表示后续操作将针对Node ID为2的CAN-CBX-DIO8来进行。读取Index 1014(COB_ID Emergency Object),查看其初始值为0x82,后续Node ID为2的CAN-CBX-DIO8将会作为heartbeat consumer来监测heartbeat producer所发的心跳消息,若在设定的时间内没有收到心跳消息,Node ID为2的CAN-CBX-DIO8将会发送CAN ID为0x82的CAN消息提示没有收到心跳。
  5. 使用COBview读取Node ID为2的装置的Index 1016 sub 1的值,将其改为0x00010FA0,含义为监测Node ID为1的装置,若在0xFA0秒即4秒内没有监测到其心跳消息,则发送CAN ID为0x82的消息。
  6. 使用COBview,将Module No.改为1,不勾选All (NMT),点击reset,重置Node ID为1的装置,使其不再成为heartbeat producer。
  7. 查看CANreal,在点击reset Node 1之后4秒的时候,CAN ID为0x82的CAN消息从Node 2这发出。有8个bytes的数据,如30 81 11 01 00 00 00 00。参考CiA 301文档或者CAN-CBX-DIO8文档,section 8.9.3 Pre-defined Error Field (1003h),30 81含义为emergency-error-code值为0x8130 Life guard error or heartbeat error;11含义参考section 8.9.2 Error Register (1001h),error register值为generic和communication error (overrun, error state);01含义参考section 8.9.3 Pre-defined Error Field (1003h),指在Node 2的Index 1003中,目前存储的error list的条目总数,目前为存储了1条error。可以使用COBview读取Node 2的Index 1001和1003查询上述错误代码。

试验七:

之前的试验中的一些配置,如配置heartbeat,配置TxPDO transmission type等等都会在设备断电后,恢复到原来的出厂设置。若想要设备断电后依然能保留这些设置,可以参考CAN-CBX-DIO8文档section 8.9.11 Store Parameters (1010h),将设置好的参数保存到设备的EEPROM中。

  1. 使用on command的方式存储Index 1800的修改后的设置。 1.1 使用COBview读取Node 1的Index 1800,将sub 1的值由初始的0x181改为0x381,将sub 2的值由初始的0xFF改为3。 1.2 使用COBview读取Node 1的Index 1010,sub 1的值为1,表示设备可以用on command方式存储设置参数。在sub 1写入"save"的值,即下command让其存储设置参数。 1.3 将Node 1设备断电5秒后,再将其接通电源。 1.4 使用COBview读取Node 1的Index 1800,可以看到sub 1依然保留着修改过的值0x381,sub 2依然保留着修改过的3的值。 1.5 接下来将Index 1800的参数恢复初始设置。使用COBview读取Node 1的Index 1011(Restore Default Parameters),sub 1的值为1,表示设备可以用on command方式恢复初始设置。在sub 1写下"load"的值,即下command让其恢复初始设置。 1.6 将Node 1设备断电5秒后,再将其接通电源。 1.7 使用COBview读取Node 1的Index 1800,sub 1的值恢复到初始的0x181,sub 2的值恢复到初始的0xFF。

  2. CAN-CBX-DIO8不支持使用auto的方式存储修改后的设置参数。

常用术语

RxPDO: Receive-PDO, CANopen网络 -> CAN-CBX-DIO8 TxPDO: Transmit-PDO, CAN-CBX-DIO8 -> CANopen网络