首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Delphi和libnodave库从PLC读取数据

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

Stack Overflow用户
提问于 2015-11-09 07:46:47
回答 1查看 1.9K关注 0票数 0

我再次带着一个新的问题来到这里,这次是关于PLC的。

我首先说我是PLC的新手,直到两个月前我才见过他们中的一个。我被要求编写一个程序,从Delphi中读取来自PLC西门子S7-300的一些数据,以便将它们存档在Server数据库中。我用的是“利布诺达夫”图书馆。

这个程序很简单。我必须验证一点,当它打开时,我必须从PLC读取数据并启动该位。有了我告诉过的库,我可以在没有问题的情况下读写,但是我必须读取的数据存储在一组字节中(大约60字节),所以我必须读取一些字节,跳过其他字节,读取其他字节。此外,我必须测试的位在这组字节的末尾。

所以我读取了整个字节组,我把数据放到一组变量中,然后测试这个位,如果是的话,我把数据存储到数据库中。为了跳过不需要读取的字节,我使用了这样的语句:

代码语言:javascript
复制
for i := 1 to 14 do
    daveGetU8(dc);
for i := 1 to 6 do
    daveGetU16(dc);

我的问题是:

  • 有更好的方法来读取数据,跳过那些我不需要阅读的数据?
  • 读取整个字节组并在测试该位之后是否方便,还是将两个读取分开比较好?

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

爱神星

EN

回答 1

Stack Overflow用户

发布于 2015-11-09 10:29:55

与PLC通信需要一些开销。

你发出了一个请求,过了一段时间,你收到了一个答复。通信通常是通过带宽有限的串行线路进行的。

时间安排则包括:

  • 发送请求的时间
  • PLC响应的时间
  • 传递响应的时间

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

无论如何,轮询标志字节似乎是合理的做法。

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

既然你知道规格,你就可以自己做数学了。

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

只有你可以说额外的70毫秒的投票时间是可以接受的。

编辑:在评论中指出,通信是通过100+ MBit/s线上的以太网进行的。在这种情况下,我建议在一个命令中读取所有数据,并在PC中进行处理。对这种带宽来说,定时几乎不受关注。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33604544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档