注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

冷若寒梅

积跬步以致千里life is what you make it.love it

 
 
 

日志

 
 

CANopen编程  

2010-09-12 19:49:21|  分类: CoDeSys |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

4.1 物理层< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

EPEC物理层遵循 ISO 11898标准. 传输速率为 250 kbit/s

4.2数据链路层

CANopen 使用标准的CAN 11位标识符 0-8 bytes 有效数据。

CAN ID

11  bit

数据长度

1-8

D1

8bit

D2

8 bit

D3

8 bit

D4

8 bit

D5

8 bit

D6

8 bit

D7

8 bit

D8

8 bit

CAN Message = CAN Frame

4.3  CAN总线

< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />

CAN2.0B

串行数据传输

CAN

< xmlnamespace prefix ="w" ns ="urn:schemas-microsoft-com:office:word" />

CAN2.0A

 

 

 

 


CAN分为CAN2.0ACAN2.0B两种硬件标准,CAN2.0A11位标识符,而CAN2.0B11位和29位两种标识符。

CANOpen遵循的是CAN2.0A标准,有11位标识符。

 

 

4.4主从关系

Master

node

Slave

node

Slave

node

Slave

node

CANopen

 

 

 

 

 

 

 


每一个 CANopen 设备都有一个接点号, CANopen网络有一个主接点,可以有多个从接点。

CANopen主接点的作用为:

激活网络;

停止网络;

隔离错误接点

EPEC 系统的主从由 CANmoon 设置。

EPEC 系统CANopen主接点的作用是激活网络。

CANopen系统所有接点由 ID号标识。

ID 范围1..127 CANopen 网络最多可以有127 不同的接点。

PDO协议:

PDO = Process Data Object,即CAN信息。

CANopen 设备之间通过PDO 传递信息。

PDO所传输的是工作数据。

 

PDO

接收

PDO

Time

 


            

PDO

发送

PDO

PDO

PDO

接收

PDO

接收

 

 

 

 

 


PDO (tx) (Transmit PDO)发送者 (CANopen node)发送信息到 CAN 总线上,而接受者根据需要从CAN总线读取信息。通讯方式为一点对多点。

SDO协议:

SDO = Service Data Object

SDO所传输的是服务数据。

SDO

Server

SDO

Client

Time

 

 

 

 

 


SDO客户机发送需求信息到SDO 服务器, SDO 服务器发送应答信息回SDO客户机。通讯方式为点对点。

有两种基本的SDO服务,下载SDO ()和上传SDO (). 下载 SDO 用于客户机改变服务器里的目标值,上传 SDO用于客户机读取服务器里的目标值.

 SDO 传输可以并不只是一问一答,可以传输更多的报文,叫 SDO块服务。

预定义连接设置

最基本的预定义连接设置表示系统不用另外的设置就可通讯,下表所示为CAN接点的报文ID号,由11位二进制数组成,高4位为功能代码,低7位为接点的ID号。

 

 

 

node ID 1

node ID 2

Node ID 3

node ID 15

PDO1 (tx)

0x181

0x182

0x183

0x18F

PDO2 (tx)

0x281

0x282

0x283

0x28F

PDO3 (tx)

0x381

0x382

0x383

0x38F

PDO4 (tx)

0x481

0x482

0x483

0x48F

EPEC 中的报文ID表示.

 

 CANOPEN EPEC 3G IEC模块中的应用

系统设计必须对网络接点ID进行配置,选择一个接点作为主接点,在每个接点写CANOPEN的初始化代码,所有数据必须用输入输出映象区进行分配。

CANopen的初始化

: 网络中有3 Epec 模块,一个为 2024,另外两个为 2023。第一个 2023配置为 ID 4 作主接点,第二个2023 配置为 ID 7 作从接点, 2024配置为ID 10作从接点。对每个接点写CANopen 初始化代码, 使每个接点都能从其他接点接收数据信息。

Epec IEC-software有标准的程序模块, 名为“CANopen_initialization”

1. FUNCTION_BLOCK CANopen_initialization

2. VAR_INPUT

3. END_VAR

4. VAR_OUTPUT

5. END_VAR

6. VAR

7.booting:BOOL:=TRUE;

8. END_VAR

9.

10. (* CAN initialization *)

11. IF(booting) THEN

12.CANOPEN_START_INIT(ENABLE:=TRUE);

13.CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE, PDO_TYPE_SELECT:=FALSE, ID:=4);

14CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE, PDO_TYPE_SELECT:=FALSE, ID:=10);

15.CANOPEN_END_INIT(ENABLE:=TRUE);

16.booting:=FALSE;

17. END_IF

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


这是从接点 ID7CANOPEN初始化程序代码,这个功能模块使ID7接点可以发送数据到总线,也可以从总线上接收其他接点的数据。

变量“booting” 使CANOPEN初始化程序只执行一次,

Line 12.告知系统 CANopen 初始化代码开始;

Line 13. 告知系统该模块可接受来自ID 4的信息;

Line 14. 告知系统该模块可接受来自ID 10的信息;

Line 15. 告知系统 CANopen初始化代码结束。

一旦CANopen 初始化生效, 模块会自动往总线发送PDO 信息。

 

 

1. FUNCTION_BLOCK CANopen_initialization

2. VAR_INPUT

3. END_VAR

4. VAR_OUTPUT

5. END_VAR

6. VAR

7.booting:BOOL:=TRUE;

8. END_VAR

9.

10. (* CAN initialization *)

11. IF(booting) THEN

12.CANOPEN_START_INIT(ENABLE:=TRUE);

13.CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE,PDO_TYPE_SELECT:=FALSE,ID:=4);

14.CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE, PDO_TYPE_SELECT:=FALSE, ID:=7);

15.CANOPEN_END_INIT(ENABLE:=TRUE);

16.booting:=FALSE;

17. END_IF

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


这是从接点 ID10(2024)CANOPEN初始化程序代码,这个功能模块使ID10接点可以发送数据到总线,也可以从总线上接收其他接点的数据。

1. FUNCTION_BLOCK CANopen_initialization

2. VAR_INPUT

3. END_VAR

4. VAR_OUTPUT

5. END_VAR

6. VAR

7.booting:BOOL:=TRUE;

8.Count: USINT;

9. END_VAR

10. (* CAN initialization *)

11. IF(booting) THEN

12.CANOPEN_START_INIT(ENABLE:=TRUE);

13.CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE, PDO_TYPE_SELECT:=FALSE, ID:=7);

14.CANOPEN_ADD_NODE_RECEIVE_FROM(ENABLE:=TRUE, PDO_TYPE_SELECT:=FALSE, ID:=10);

15.CANOPEN_END_INIT(ENABLE:=TRUE);

16.booting:=FALSE;

17. END_IF

(*Master send start message *)

IF(Count>=101)THEN

         Count:=1;

END_IF

State();

IF((Count=100 AND State.OPERATIONAL )OR (Count=0))THEN

   CANOPEN_START_NODES(TRUE);

END_IF

Count:=Count+1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


这是从接点 ID4(2023)CANOPEN初始化程序代码,这个功能模块使ID4接点可以发送数据到总线,也可以从总线上接收其他接点的数据。

18. – 27. 行代码是专为主接点写的, 目的是发送网络管理命令START启动网络接点 ,并每隔一段时间刷新一次. 这里仅是一个示例,可以编写不同的功能代码。

 

发送PDOs CANopen 总线

EPEC控制器中,发送PDO (tx)信息到CANopen总线就是把数据写入IEC输出映象区, 起始地址为 %QW200( =%QB400).  模块的硬件会把正确的PDO (tx) 发送到CANopen总线。

硬件发送PDO (tx):300ms发送一次,或当数据发生变化时发送 (cyclic/acyclic)

%QW200

%QW201

%QW202

%QW203

 

映象地址

PDO1 (tx)

 

 

 


上表的意思是:把 %QW200-%QW203 打包为第一个PDO1发送到总线。

 

 

PDO2 (tx)

%QW204

%QW205

%QW206

%QW207

 

 

 


%QW204-%QW207 打包为PDO2发送到总线。

 

 

PDO3 (tx)

%QW208

%QW209

%QW210

%QW211

 

 

 

 


%QW208-%QW211 打包为PDO3发送到总线。

 

 

PDO4 (tx)

%QW212

%QW213

%QW214

%QW215

 

 

 

 

 


%QW212-%QW215 打包为PDO2发送到总线。


1. FUNCTION_BLOCK Example

2. VAR_INPUT

3. END_VAR

4. VAR_OUTPUT

5. END_VAR

6. VAR

7.   (* PDO 1 *)

8.   CANO_EngineRPM AT %QW200: UINT;

9.   CANO_EngineTemp AT %QW201: UINT;

10. CANO_EngineOilPres AT %QW202 :UINT;

11. CANO_EngineVoltage AT %QW203: UINT;

12.

13. (* PDO 2 *)

14. CANO_Potentiometer AT %QW204:UINT;

15. CANO_Sensor1 AT %QB410:BYTE;

16. CANO_Sensor2 AT %QB411:BYTE;

17. CANO_Switch1 AT  %QX206.0:BOOL;

18. CANO_Switch2 AT  %QX206.1:BOOL;

19. CANO_Switch3 AT  %QX206.2:BOOL;

20.END_VAR

21.

22.

22.(* Code *)

23. CANO_EngineRPM:=2100;

24. CANO_EngineTemp:=95;

25. CANO_EngineOilPres:=330;

26. CANO_EngineVoltage:=27;

27. CANO_Potentiometer:=32000;

28. CANO_Sensor1:=255;

29. CANO_Sensor2:=1;

30. CANO_Switch1:=TRUE;

31. CANO_Switch2:=FALSE;

32. CANO_Switch3:=TRUE;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


在此例中,所有的变量都被配置到CANOPEN,变量名都以CANO (CAN Output)打头,表示变量发送到CANOPEN代码块22-32行是简单的赋值语句。

 

我们假定接点的ID号是4,那么, 这个例子的代码产生如下PDO

PDO 1 (tx) id=184h, 数据长度=8,

d0 = 34h, d1=8h, d2=5fh, d3=0h, d4=4ah, d5=1h, d6=1bh, d7=0h

engine rpm is in        d0,d1         834h = 2100

engine temp is in      d2,d3    005fh = 95

engine oil pres is in d4,d5       14ah = 330

engine voltage is in    d6,d7     001bh = 27

 

PDO 2 (tx) id=284h, dlc=8,

d0 = 0h, d1=7dh, d2=ffh, d3=1h, d4=5h, d5=0h, d6=0h, d7=0h

potentiometer is in    d0,d1     7d00h = 32000

sensor1 is in        d2   ffh = 255

sensor2 is in        d3   1h = 1

switch1 is in              d4 bit 0  1 = TRUE

switch2 is in              d4 bit 1  0 = FALSE

switch3 is in              d4 bit 2  1 = TRUE

 

 

CANOPEN总线接收PDO

PDOs CANopen 总线

EPEC控制器中,从CANopen总线接收PDO (tx)信息就是从IEC输入映象区读取数据, 起始地址为 %IW200( =%IB400). 

映象地址

映象地址根据CANOPEN初始化代码进行分配, 接收信息中,按优先级排列依次分配输入映象地址,优先级最高的ID接点,他的PDO地址为%IW200- %IW215,第二个接点的PDO地址为 %IW216-%IW231,第三个接点的PDO地址为%IW232-%IW247 ,依次类推。

Mapping examples:

 

 

 

 

这是第一个接点的第一个PDO1, %IW200->%IW203.

 

 

 

 

 

 

 

  评论这张
 
阅读(1531)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017