使用Delphi和libnodave库从PLC读取数据

时间:2015-11-09 07:46:48

标签: delphi plc libnodave

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

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

该计划非常简单。我必须验证一下,当它打开时,我必须从PLC读取数据并将该位置位。我已经告诉过库我可以读写没有问题,但是我必须读取的数据存储在一组字节(大约60个字节)中,所以我要读取一些字节,跳过其他字节并读取其他字节。此外,我必须测试的位在这组字节的末尾。

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

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

我的问题是这些:

  • 有一种更好的方法来读取跳过我没有的数据 阅读?
  • 读取整个字节组是否方便 测试一下还是最好将两个读数分开?

我这样说是因为我在互联网上发现读取操作需要一些时间,因此最好能够使最小读数成为可能。

性爱

1 个答案:

答案 0 :(得分:1)

与PLC通信涉及一些开销。

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

时间安排包括:

  • 发送请求的时间
  • PLC回复的时间
  • 转移回复的时间

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

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

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

你可以自己做数学,因为你知道规格。

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

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

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