0

我又来了一个新问题;这次是关于PLC。

我首先说我是 PLC 的新手,直到几个月前我才见过其中一个。我被要求编写一个程序,从 Delphi 读取来自 PLC Siemens S7-300 的一些数据,以便将它们归档到 SQL Server 数据库中。我正在使用“libnodave”库。

该程序非常简单。我必须验证一下,当它打开时,我必须从 PLC 读取数据并关闭该位。使用我所说的库,我可以毫无问题地读写,但是我必须读取的数据存储在一组字节(大约 60 个字节)中,所以我必须读取一些字节,跳过其他一些字节并读取其他字节。此外,我必须测试的位在这组字节的末尾。

所以我读取了整个字节组,将数据放入一组变量中,然后测试该位,如果它打开,我将数据存储到数据库中。为了跳过我不必阅读的字节,我使用这种语句:

for i := 1 to 14 do
    daveGetU8(dc);
for i := 1 to 6 do
    daveGetU16(dc);

我的问题是:

  • 有更好的方法来读取数据,跳过我不必读取的数据吗?
  • 读取整个字节组并在测试位后方便还是将两个读取分开更好?

我这样说是因为我在互联网上发现读取操作需要一些时间,所以最好尽可能减少读取次数。

爱神

4

1 回答 1

1

与 PLC 通信需要一些开销。

您发送请求并在一段时间后收到答复。通常,通信是通过带宽有限的串行线路进行的。

时间安排包括:

  • 发送请求的时间
  • PLC 响应时间
  • 转移响应的时间

很难对您的问题给出明确的答案,因为我们不知道时机有多关键。

无论如何,轮询标志字节似乎只是合理的方式。

设置标志后,在一个命令中读取整个块,然后清除标志。读取小部分数据以避免间隙,可能比一次读取整个块更耗时。

由于您知道规格,因此您可以自己进行数学计算。

示例:假设波特率为 9600 波特。这意味着大约每毫秒传输时间 1 个字节。读取的命令大约 10 个字节长,块回答大约 70 个字节(假设协议是二进制的)。PLC延迟时间约50 ms。这增加了 130 毫秒,而读取标志只增加了大约 70 毫秒。

只有您可以说 70 毫秒的额外轮询时间是否可以接受。


编辑:在评论中指出,通信是通过 100+ MBit/s 线路上的以太网进行的。在这种情况下,我建议在一个命令中读取所有数据并在 PC 中进行处理。对于这样的带宽,时间无关紧要。

于 2015-11-09T10:29:55.370 回答