<< 点击显示目录 >> 主页 贝加莱CAN通讯使用例程说明 > 通过编程实现CAN通讯 > 功能块与函数说明 > CAN_Lib > CAN_Lib - CMS Function Blocks and Functions > CMSattach() |
功能块CMSattach()和CMSdetach()保证了在应用CAN数据时,对于非模块化的数据类型如数组或结构,CMS数据模块中引用的变量的一致性。这使得从应用程序中控制对CMS数据对象的过程变量的访问成为可能。由于系统中的任务优先级,这些功能块只有在任务类Cyclic#2-Cyclic#8中使用时才有意义。对于任务类别Cyclic#1,数据的一致性可以通过CMS数据模块的参数 "info"(位1=1)来保证。
额外的 "CMSattach"/"CMSdetach "功能可以通过在功能块 "CMSinit "中设置参数queue_cnt为1来启用。如果这个模式没有被启用,那么在调用功能块 "CMSattach "或 "CMSdetach "时就会发生错误ERR_CAN_WRMODE(8824)。
在调用功能块CMSattach()后,CMS数据对象中所有被引用的过程变量的所有接收的CAN数据都被复制到一个单独的数据缓冲区。当再次收到相同的数据时,这个数据缓冲区会被覆盖。功能块 "CMSattach "和 "CMSdetach "可以在同一CMS数据对象(cms_ident)的不同任务类中多次使用。在一个CMS数据对象的最后一次 "CMSdetach"(attachCount = 0)中,所有临时保存的CAN数据被复制到相关的过程变量中。
功能块CMSattach()在Automation Runtime V4.41及以后版本中可用。
这个功能块只能 在某些情况下用于 冗余!
适用的限制在以下章节中列出。
关于冗余的更多信息,请参见 冗余部分 。
输入/输出 |
参数 |
数据类型 |
说明 |
IN |
enable |
BOOL |
该功能块只有在 enable ≠ 0时才会被执行 。 |
IN |
cms_ident |
UDINT |
来自 CMSinit()的CMS标识符 |
OUT |
attachCount |
UDINT |
CMS对象的 "附加 "动作的数量 |
OUT |
Status |
UINT |
错误编号 (0 = 无错误) |
CMSattach(enable,cms_ident,attachCount,status)
例子。
CMSattach(cms_ident)
udintvar1 = candaten[0] + SHL(candaten [1]),8)+ SHL(candaten [2]),16) + SHL(candaten [3]),24)
CMSdetach(cms_ident)
功能块中所有接收到的CAN数据被暂时保存在CMS数据对象的所有CMS对象中。
CMS条目 |
CAN ID |
PV名称 |
8字节的数据缓冲区,用于保存CAN数据 |
1 |
101 |
PV1 |
|
2 |
102 |
2.PV2 |
|
3 |
103 |
PV3 |
|
任务优先级
对象优先级 |
|
循环 #1 |
230 |
IFx_CanEventHandler |
224 |
循环 #2 |
218 |
循环 #3 |
200 |
循环 #4 |
198 |
循环 #5 |
196 |
循环 #6 |
194 |
循环 #7 |
192 |
循环 #8 |
190 |
案例3: 当接收到CAN数据时,CanEventHandler在结构变量被访问时中断了任务类Cyclic #2中的用户任务。CanEventHandler将新数据复制到结构变量中。结构变量中的数据在Cyclic#2用户任务的上下文中可以是不一致的。
案例4: 当接收到CAN数据时,CanEventHandler在访问结构变量时中断了任务类Cyclic#2中的一个用户任务。如果功能块 "CMSattach "在Cyclic#2用户任务的上下文中为CMS数据对象提前调用,那么接收到的CAN数据将被临时保存,而不是复制到一个变量中。只有在调用功能块 "CMSdetach "后,临时保存的CAN数据才被复制到变量中。因此,结构变量的数据在Cyclic#2用户任务的背景下保持一致。
中断CAN |
当接收CAN数据时,CAN中断处理程序会触发CanEventHandler。 |
||||
IFx_CanEventHandler |
CanEventHandler将接收到的CAN数据复制到CMS数据模块中指定的变量。 |
||||
循环#2用户任务 |
使用CMS数据模块的变量的用户任务 |
有关与CMS对象工作的其他信息。