我再次带着一个新的问题来到这里,这次是关于PLC的。
我首先说我是PLC的新手,直到两个月前我才见过他们中的一个。我被要求编写一个程序,从Delphi中读取来自PLC西门子S7-300的一些数据,以便将它们存档在Server数据库中。我用的是“利布诺达夫”图书馆。
这个程序很简单。我必须验证一点,当它打开时,我必须从PLC读取数据并启动该位。有了我告诉过的库,我可以在没有问题的情况下读写,但是我必须读取的数据存储在一组字节中(大约60字节),所以我必须读取一些字节,跳过其他字节,读取其他字节。此外,我必须测试的位在这组字节的末尾。
所以我读取了整个字节组,我把数据放到一组变量中,然后测试这个位,如果是的话,我把数据存储到数据库中。为了跳过不需要读取的字节,我使用了这样的语句:
for i := 1 to 14 do
daveGetU8(dc);
for i := 1 to 6 do
daveGetU16(dc);我的问题是:
我这么说是因为我在互联网上发现阅读操作需要一段时间,所以最好是尽可能减少阅读次数。
爱神星
发布于 2015-11-09 10:29:55
与PLC通信需要一些开销。
你发出了一个请求,过了一段时间,你收到了一个答复。通信通常是通过带宽有限的串行线路进行的。
时间安排则包括:
你的问题很难给出明确的答案,因为我们不知道时机有多重要。
无论如何,轮询标志字节似乎是合理的做法。
设置标志时,在一个命令中读取整个块,然后清除标志。以小部分读取数据以避免空白,可能比一次性阅读整个块更耗时。
既然你知道规格,你就可以自己做数学了。
例如:假设波特率是9600波特率。这意味着大约每毫秒传输时间为1字节。要读取的命令大约有10字节长,块回答大约70字节(假设协议是二进制的)。PLC延迟时间约50 ms。这增加了130毫秒,而读取标志只增加了大约70毫秒。
只有你可以说额外的70毫秒的投票时间是可以接受的。
编辑:在评论中指出,通信是通过100+ MBit/s线上的以太网进行的。在这种情况下,我建议在一个命令中读取所有数据,并在PC中进行处理。对这种带宽来说,定时几乎不受关注。
https://stackoverflow.com/questions/33604544
复制相似问题