簡體   English   中英

使用Delphi和libnodave庫從PLC讀取數據

[英]Read data from PLC with Delphi and libnodave library

我又來了一個新問題。 這次關於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);

我的問題是:

  • 有一種更好的方法可以跳過我不必讀取的數據來讀取數據?
  • 讀取整個字節組並在對該位進行測試之后是否方便,還是將兩個讀取分開?

我之所以這樣說,是因為我在互聯網上發現讀操作需要一些時間,因此最好盡可能減少讀取次數。

愛神

與PLC通訊涉及一些開銷。

您發送一個請求,一段時間后您會收到一個答案。 通常,通信是通過帶寬受限的串行線進行的。

時間包括:

  • 發送請求的時間
  • PLC響應時間
  • 轉移答復的時間

由於您不知道時間安排的緊迫性,很難對您的問題給出確切的答案。

無論如何,輪詢標志字節似乎只是一種合理的方法。

設置標志后,用一個命令讀取整個塊,然后清除標志。 讀取少量數據以避免間隙,這比一次讀取整個塊更耗時。

您可以自己做數學,因為您了解規格。

示例:假設波特率為9600波特。 這意味着每毫秒傳輸時間大約1個字節。 讀取的命令長約10個字節,塊回答約70個字節(假設協議是二進制的)。 PLC的延遲時間約為50毫秒。 這增加了130毫秒,而讀取標志僅增加了約70毫秒。

只有您可以說70毫秒的額外輪詢時間是否可以接受。


編輯 :在注釋中指出,通信是通過100+ MBit / s線路上的以太網進行的。 在這種情況下,我建議通過一條命令讀取所有數據並在PC中進行處理。 定時與這種帶寬無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM