Win32:三菱FX3U/FX5U读写软元件方法和注意事项

目录

一、常见编址类型

二、不同编址类型的读写形式

三、需要特别避开的坑


一、常见编址类型

也就是地址编号的单位了,主要有以下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目录)里面去了。

所以这两个函数不是线程安全的,需要我们自己保证它安全。

两个接口不允许同时调用,必须用同一把锁进行同步

注意不是在百里外挂一把锁,是在原子操作的共享段挂一把锁。

如果遇到有什么疑问,可留言或站内私信消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌志辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值