前言
之前想写这个功能块的,不过又又又一直拖更到现在。今天早上有点时间,就把这个功能块框架也给写了。常规选用 AS228T 这款 PLC 控制台达自己家的变频器。可以采用 Canopen 的通讯方式,而 Canopen 总线通讯方式又分为专属模式和 DS301 模式。这个功能块主要针对的是后者。因为后者可以带的数量超过前者。
正文
默认的 CANOPEN 的通讯地址分配
RxPDO 在地址 D25032 开始 100 个 Word
TxPDO 在地址 D24032 开始 100 个 Word
变频器默认的 PDO 常规所需映射如下:
(*
变频器功能块
//RxPDO
D25032 Uint 控制字
D25033 Int 设置速度
D25034 Udint 加速时间
D25036 Udint 减速时间
//TxPDO
D24032 Uint 状态字
D24033 Uint 错误码
D24034 Int 反馈速度
*)
复制代码
功能块变量
Class Identifiers Address Type Initial Value Comment
VAR_IN_OUT IO_iCMD INT
VAR_INPUT In_wAddressE WORD
VAR_INPUT In_iSetSpeed INT
VAR_INPUT In_UdiAccTime DWORD
VAR_INPUT In_UdiDecTime DWORD
VAR_OUTPUT Out_UiErrorID WORD
VAR_OUTPUT Out_iActSpeed INT
VAR_OUTPUT Out_UiStatus WORD
复制代码
功能块程序
E0 := In_wAddressE ;
//设置
D25033@E0 := In_iSetSpeed ;
D25034@E0 := In_UdiAccTime ;
D25036@E0 := In_UdiDecTime ;
//反馈
Out_UiStatus := D24032@E0 ;
Out_UiErrorID := D24033@E0 ;
Out_iActSpeed := D24034@E0 ;
CASE IO_iCMD OF
1:
D25032@E0 := 127 ; //启动
9:
D25032@E0 := 139 ; //复位
IO_iCMD := 90 ;
90:
IF (Out_UiStatus.3 = FALSE) THEN
IO_iCMD := 0 ;
END_IF;
ELSE
D25032@E0 := 126 ; //停止
END_CASE;
复制代码
主程序调用
希望后期 AS 架构下能把功能块也进行数组形式去声明,那就更加方便了。
现在暂时只能是功能块的输入输出引脚的变量用数组去声明。还不够完善。
暂时还是只能每一个功能块去单独声明。
这个功能块对 C2000Plus\CH2000\MS300\MH300 都能适用。
结尾
善用 E 变址去实现功能块内部的绝对地址的复用。
评论