2016-11-07 169 views
-1

希望有在那裏誰需要一些娛樂無聊的PLC MODBUS專家..我要瘋了試圖弄清楚這一點。PLC/Modbus讀線圈狀態(MODBUS TK)

我想讀一個東元SG2 20VR-d的輸出線圈Q1至Q8的狀態。

我在Python中使用Modbus-TK,我可以很容易地與PLC通信寫入線圈,讀取寄存器等。但我無法弄清楚怎麼讀出輸出線圈Q1-Q8,所以我可以檢查他們的狀態。

地址表在附件PDF第29/31頁。我的單位是V3型。

如果你讀了29頁的小字有關於通過10小時乘以一些晦澀的消息????幫幫我!

當我使用這個命令時,我得到一個簡單的元組,其唯一值爲零。

slave_address = 1 

command = 1 #read coils 

coil_address = 11312 # this is 2c30h converted to decimal. 2c30h is the address for Q1 according to the pdf 

master.execute(slave_address, command, coil_address) 

(當我評價Pycharm ..表達這個我所得到的) 返回:

result = {tuple} <type 'tuple'>:() 
__len__ = {int} 0 

麻煩的是Q1通電(關閉),因此它應該顯示1或65280不爲0 ,所以這不可能是正確的。

我應該使用線圈地址的某種範圍?任何人都可以解釋這應該怎麼做?

Teco SG3 Modbus Manual

回答

0

我一點兒也不熟悉,你在做什麼,但快速瀏覽的文檔顯示,你不爲READ_COILS命令指定所有需要的參數 - 也有一個「 quantity_of_x「參數(讀取的線圈數量,對於此特定命令),modbus-tk默認爲0.因此,您要求總共零個線圈的值,這與您得到的結果完全一致。這個參數顯然需要是0x10的倍數,所以你不得不請求更多的Q1-Q8值 - 其他8個值是垃圾。

+0

感謝...你在哪裏找到MODBUS-TK的文件。我一直在尋找高和低良好的文檔,但沒有找到它。 –

+0

我沒有看到任何獨立文檔,但是在https://github.com/ljean/modbus-tk/blob/master/modbus_tk/modbus.py – jasonharper

+0

的源文件中找到了docstrings。線圈爲16的倍數是非常尷尬的,非標準行爲。無論如何,這是Modbus,每個實現都有其怪癖。只需使用16作爲線圈的數量,它應該工作, – Ronaldo

0

「01H:用戶設定10H的起始地址等於多發,線圈也10H平等多數量」

的Modbus實現通常期望無論是全寄存器值(使用的是什麼,我認爲)或抵消。您是否嘗試通過將基址寄存器乘以16(10h)來獲得偏移量?

您是否嘗試查看傳出和傳入消息的線索? Wireshark會自動爲您分解Modbus消息。

我沒有直接回答你,有很多這方面的東西,你必須潛入它自己,因爲每個Modbus通信協議是一個有點不同。

我不知道你的技能水平,但我會通過法醫採摘除了在Wireshark的消息(字節)要弄清楚到底是什麼設備正在恢復,並驗證您要發送什麼開始。該信息還可以幫助:

http://support.autosoln.com/support/index.php?/Knowledgebase/Article/View/63/0/modbus-protocol-overview-debugging-your-acm-configuration-by-dissecting-modbus-messages