使用设备:C37-000S1、SM277C 使用软件:CODESYS SP4 目的:实现C37与SM277C后的模拟量模块通信 步骤: 1. 新建项目,添加CANbus,光标定位C37右击选择添加设备,选择CANbus,
2. 添加CANopen,光标定位CANbus右击选择添加设备,选择CANopen_Manager
3. 添加EM277C,光标定位CANopen右击选择添加设备,选择EM277C
4. 组态canopen网络,本次项目设置波特率为1M,277C地址为2
5. 在“服务数据对象”页面,选择“新建”,在弹出的对象目录中选择添加“16#2200:16#00”下的“:16#01”,注意:如果不添加此索引将不能与277C通信成功
6. 将277C实际的波特率拨码为1M,地址为2,并断电重启 7. 读写3个模拟量模块通道值,SM277C+2路输出模块(232-0HB)+普通8路输入模块(231-0HF)+8路温度模块(231-7NF) C37对于CANopen上扩展模拟量I/O的访问不需要在SM277C后组态相应的模块,只需实际挂上相应的模块然后通过使用SDO读写指令来执行,且不能读写其中的某个模块每次必须读完SM277C后的所有模块,因此读写缓冲区长度要与实际环境组态的相一致。 例如:当前实际环境中组态了16路模拟量输入和2路模拟量输出,因此就要定义32个字节大小的读缓冲区和4个字节大小的写缓冲区,定义“arry0”和“arry1”分别为写、读缓冲区地址,“datelen0”和“datelen1”分别为写、读缓冲区长度。
定义完所需变量后就可以编写SDO功能块用以SDO的读写操作了,需要用“CIA405.SDO_WRITE”和“CIA405.SDO_READ”2条指令,这里要注意的是 针对SM277C,SDO读指令的“INDEX”需设置为16#6500, “SUBINDEX”需设置为1; SDO写指令的“INDEX”需设置为16#6600, “SUBINDEX”需设置为1; DEVICE参数为CANopen 设备的节点ID即SM277C的节点ID为2, CHANNEL为SDO 通道编号,缺省值 = 1。 MODE为数据传输模式,缺省值0 表示自动模式选择, 其他参数值按下图设置,输出CONFIRM位当完成时置1
8. SDO都配置完成后就可以下载并运行工程通过SM277C访问其后的扩展IO了,注意模拟量输入输出值的高低字节是颠倒的,因此结果需要特别注意,232-0HB的第1路输出接231-0HF的前4路输入,232-0HB的第2路输出接231-0HF的后4路输入 如果输出通道写10#32000和10#16000,高低字节相反且由于输入通道值有波动,因此低字节的波动会变成高字节的波动,会导致10进制数值有较大的偏差,结果非常不好确认,因此将数值转换为16进制,可以比较明显看出结果。 如果输出通道写16#7D00(10#32000)和16#3E80(10#16000),由于高低字颠倒则实际写入值为16#007D(10#125)和16#803E(10#-32760),由于231-0HF默认单极性输入0-10V(全量程0-32000),因此后1通道写入的值超过量程读回来的为0, 如下图所示,左边为C37后的结果,右边图为在H36后的结果。
因此如果要给输出写10#32000(16#7D00),则需要写的值应该是10#125(16#007D),给输出写10#16000(16#3E80),则需要写的值应该是10#32830(16#803E)。结果如下图所示
补充说明: 1.读SDO指令的读写缓存区长度必须大于等于实际组态环境总输入输出字节数 2.由于在组态上SM277C后没有组态模块对后面所挂的模块不会做检测,即如果SM277C后面挂的不是CH200扩展模块SM277C也不会报错,因此如果指令不能读写模拟量数据可能是后面挂的模块不是CH200扩展模块而是CTSC-200扩展模块引起(如果EM扩展模块挂在SM277C后的第一个位置,SDO指令会报错不能读写任何数据;如果EM扩展模块挂在SM277C的最后一个位置,SDO指令不会报错但其他SM模块数据可以正确读写但EM扩展模块数据不能读写) 3.如果模块没电源SM277C的SF灯亮读回来数据16#FE7F(高低字颠倒为10#32766);模块超量程SM277C的SF灯不亮但模拟量输入模块SF灯亮,读回来数据16#F07F(10#32752) 4.可以通过EM277C.CANopenState来判断SM277C通信是否断开
|