采用软件:unity Pro XL
目的:基础M580编程组态以及和后台组态王的通讯实现
主要用于新手借鉴MODbus通信组态王针对性转换DIDO及M区
组态王和施耐德主要通过MODBUS TCP
正常组态完成后 组态王采用400001起始可以读写施耐德莫迪康的%MW区。
需要注意的是莫迪康M580 %MW区区别于西门子点在于:
如施耐德%MW0 可以表示INT DINT REAL ,当他表示INT时,涵盖MW0:0-15字节,下一个不重复叠加的整数可以命名为%MW1;表示DINT REAL 时涵盖MW0:0-15字节及MW1:0-15字节,下一个不重复叠加的双整数或浮点数可以命名为%MW2 对应组态王读取可设置为I/O整数或实数,区域为400001
区别于西门子%MW0 可以表示INT ,而表示DINT REAL 则应该用MD0 ,当他表示INT时,涵盖MB0:0-7字节及MB1:0-7字节,下一个不重复叠加的整数可以命名为%MW2;表示DINT REAL 时涵盖MW0及MW2,下一个不重复叠加的双整数或浮点数可以命名为%MD4 对应组态王读取可设置为I/O整数或实数,区域为400001
由于莫迪康输入输出及M区写起来以及组态王换算起来比较麻烦,一般建议采用UNTIY中自带的bit_to_word或者word_to_bit转换成%MW区。
此时要注意的是莫迪康中M区和MW区不是一个区域,如西门子中采用M0.0表示一个位,对应莫迪康中编辑变量表才用的只能是%M1~%MXXX,但是此时的%M1不属于%MW1 这点也是区分于西门子编程。
如 我程序中编辑变量表bool量:
此时变量表中可以同时存在%MW0表示一个值,%M0表示一个动作互不干扰。
组态硬件和西门子类似,如图所示:
硬件组态完成后其IO地址便固定了,不像西门子可以选择更改,这里不支持更改。
我们移动鼠标到DI模块,如下图:
会发现本程序中DI其实为%I0.2.X (如第一个模块为0.2.0-0.2.15) 所以我变量表中起始编辑如下:
再移动DO第一个模块,和DI类似,这里是从0.6.X开始的:
IW及QW如上。
在组态王通讯时,我们尽量把DIDO及M区转换成%MW,这样就方便组态王读写。
DI时我们调用bit_to_word.如我把%I0.2.0~0.2.15转换成%MW0,此时当0.2.0为1时,组态王直接读取I/O离散量400001.0,此时该值也将编程1.
DO时我们调用bit_to_word.如我把%Q0.6.0~0.6.15转换成%MW2,此时当0.6.0为1时,组态王直接读取I/O离散量400003.0,此时该值也将编程1.
M时我们调用word_to_bit.如我把%MW4%转换成%M1-M16,此时当0组态王直接写入I/O离散量400005.0位为1,此时该%M1值也将置位为1.
具体如下图程序
我们可以采用write_var和read_var对MODBUS TCP上其他设备参数进行循环读写。注意同时不能置位多个读写程序,只能循环轮询。如下图:
组态王对于时间的设定,我们可以在程序中进行转换。unity的好处在于内部直接集成了INT_TO_TIME或者REAL_TO_TIME,当然还有更多。需要注意的是:
①转换出来的值是ms 设定前需要进行转换如MUL60000.0即为分钟;MUL36000000.0即为小时。
②INT的时候要注意最大值为65535,所以不能直接乘以36000000,会超量程,所以我习惯用REAL
转换过程中用到一些中间变量可以直接在变量表中命名以及选择数据类型,中间变量可以不选择地址。
基本就以上问题,具体可以参考我写的程序。组态王画面未提供需要的可以自己编辑个别变量进行测试。
欢迎各位同行交流指正。
楼主最近还看过