【发布时间】:2013-06-01 00:59:36
【问题描述】:
我正在使用 OPC DA 自动化包装器连接到 AllenBradley PLC。
我现在需要在一个单词中设置一个位,独立于任何其他位。
有什么方法可以严格实现这个功能?
我尝试过的两个选项是:
在 OPC 服务器 (Kepware) 中将字设置为单独的位。所以换句话说,我有 16 个标签,每个标签都有一点,标签名称看起来像:
[FULLTAGNAME].0
[FULLTAGNAME].1
[FULLTAGNAME].2
但这意味着我需要保留许多单独的 OPCItem 对象
另一种方法是读取整个字,使用BitConverter将其转换为位,更改我需要更改的位,然后将保持字写回PLC。
但是在测试过程中我发现线程 1 可以读取这个词。 然后线程 2 将写入字,更改位 2。然后线程 1 将更改位 4 并将整个字写回,而对位 2 的更改将被覆盖。
有谁知道我可以拥有一个 OPCItem 并写入特定位的方法?还是我坚持有很多与某个位相关的 OPCItems??
谢谢
【问题讨论】:
-
我认为您基本上已经列出了选项。就个人而言,我觉得将位捆绑成单词是不好的做法。将它们分开 - 它更清洁、更易于阅读、使用和调试。是的,您需要更多标签,但如果您从一开始就进行明智的设计,您可以通过编程方式生成标签文件,并且无需额外工作。见:stackoverflow.com/a/1168196/327083
-
很公平。我同意你的观点,将比特构建成单词有点讨厌。我只是希望有一些我不知道的事情。我以前使用过很多单独的位,但我从不喜欢
OPCItem[] Word1Bits = GenerateOpcItmes();之类的外观。感谢您的帮助。 -
这不仅仅是一个 OPC 问题,也是底层 PLC 协议问题。此 PLC 协议的“OPC 驱动程序”可能只是将修改 WORD 的单个位作为读-修改-写操作(即,它读取整个字,调整“写入”的位,然后写回整个字,所以你的多线程问题仍然存在)。您认为它只是执行位写入,但它正在模拟位写入。我会对其进行测试,除非您知道实际协议的详细信息以及该协议的 OPC 驱动程序。