目录
一、常见编址类型
二、不同编址类型的读写形式
三、需要特别避开的坑
一、常见编址类型
也就是地址编号的单位了,主要有以下8种形式
- 按位编址(1-bit编址),三菱FXnU系列PLC软元件支持这种;
- 按字节编址(8-bit编址),一般PC机的存储都是这种;
- 按字编址(16-bit编址),三菱FXnU系列PLC软元件支持这种;
- 按三字节编址(24-bit编址),PMAC的存储支持这种;
- 按双字编址(32-bit编址),少见;
- 按6字节编址(48-bit编址),较少见;
- 按8字节编址(64-bit编址),极少见;
- 按16字节编址(128-bit编址),没见过;
当然将来或许更大的编址单位,时间问题也或者是有没有必要的问题了。
就目前而言,99%的情况集中在前四种了
二、不同编址类型的读写形式
这就以上面的类型有密切关系了。
最关键的就两句话总结:
- 用什么样的接口去读什么类型的地址;
- 数据项是几位、一次地址读/写多少位,需要读/写多少次;
把这两句话想明白了,一般就没有什么问题了。
对于按位编址的,给定地址读取和写入,始终就是0/1, 很难出现问题,比如三菱PLC的M/X/Y/L/F/V/B/S等类型软元件。
但是对于多字节编址(比如:FD/SD/D/W等),而要读取的数据项的字节数又不一样大,就需要拆分几次了。
举例说明:
比如三菱PLC的 D类型软元件,它是双字类型(4字节),读取地址是按字编址,2个字节的。
那就意味着:要读D地址数据(4字节),需要读2个字地址(addr,addr+1),组合成4字节.
写入D类型地址的时候也需要写入两次。
以写入D类型地址D398为例:
long v = 你要设置的数值;long low = v & 0xffff;long high = (v & 0xffff0000) >> 16;SetAddrValue(_T("D398"), low);SetAddrValue(_T("D399"), high);
在读出来的时候也应如此高低字组合,读者自行完成,不再赘述。
三、需要特别避开的坑
针对带自动化的机器,如果上位机用的三菱的MX插件,创建的ActProgType/ActUtlType的COM接口形式进行PLC软元件读/写,直接调用的是:
- p_IProgType->GetDevice
- p_IProgType->SetDevice
就需要特别注意了,一不小心就会导致你的软件概率性出现闪退了,抓异常call stack可以一路回溯到:IProgType->GetDevice/SetDevice->EasySocketW.dll(MELSOFT目录)->ECCommunicationW.dll(MELSOFT/EasySocket/CommunicationW目录)里面去了。
所以这两个函数不是线程安全的,需要我们自己保证它安全。
两个接口不允许同时调用,必须用同一把锁进行同步。
注意不是在百里外挂一把锁,是在原子操作的共享段挂一把锁。
如果遇到有什么疑问,可留言或站内私信消息。