Dobrý den,
po aktualizaci knihovny ModBus na verzi 4.4 přestane fungovat komunikace s PLC Foxtrot, který pravděpodobně používá starší verzi této knihovny (program od PZP Heating) a komunikace konči na chybě "'Checksum error in reception '".
Při použití knihovny verze 4.2 tento problém nenastává. Verzi knihovny 4.3 pro ověření nemám k dispozici.
Je možné toto nějak vyřešit, aby bylo možné i vůči starším programům komunikovat s novější knihovnou ?
Děkuji
Odpovědi 6
Dobrý den,
mezi verzí 4.2 a 4.4 neproběhly úpravy, které by měly jakýmkoli způsobem ovlivnit kompatibilitu. Jaký z funkčních bloků pro komunikaci používáte? Používáte funkční blok přímo v programu nebo jej používáte skrze jiný funkční blok nějaké uživatelské knihovny?
Dobrý den,
používám funkční blok ModbusTCPmas a to přímo v programu, bez další uživatelské knihovny.
Co a jak je v druhém PLC nevím a nejsem schopen to ani nijak ovlivnit, musel bych vznést dotaz na výrobce.
Pokud ve svém programu použiji knihovnu ve verzi 4.2, tak komunikace funguje, když ten stejný program přeložím s knihovnou 4.4, vrací uvedený funkční blok zmíněnou chybu.
Dobrý den,
chybu kterou popisujete by blok ModbusTCPmas neměl nikdy vracet neměl. Crc se vysílá a kontroluje pouze při komunikaci Modbus RTU po seriové lince.
Pokud si dáte instanci funkčního bloku do okna Data, můžete zkontrolovat zda v proměnné <Jméno instance>.modbusRTU.isTcp je hodnota 1.
Výpis modbusRTU:
proměnná isTcp zde vůbec není, jediná zmínka v parametrech o TCP je v RecvFrom, kde je standardně 1 při použití s knihovnou 4.2 a 0 s knihovnou 4.4
Pouze provádím překlad nezměněného programu, jednou s verzí 4.2 a pak s 4.4, po teplém restartu se při použití verze 4.4 objeví uvedená chyba, u verze 4.2 pak komunikace normálně funguje. S knihovnou 4.4 funguje i proti jinému ModBus ( Victron Cerbo GX), nefunguje pouze proti jinému foxtrot.
Proměnná isTcp je ještě o něco hlouběji, až za bloky SendTo a RecvFrom a její hodnota se přepisuje do proměnné tcp v bloku RecvFrom. Pokud je v bloku RecvFrom.tcp rovno 0 pak musí být i isTcp nulové.
Otázka je proč došlo k nastavení hodnoty 0, protože hodnota 1 se v bloku při změně programu "natvrdo" zapisuje jednička.
Nalezl jsem hazard v inicializaci příznaku isTcp. Ta neproběhne v případě, že se blok během restartu nevolá. Myslím, že tento hazard souvisí s problémem, který jsme spolu řešili.
Verze 4.5 knihovny ModbusRTU, která problém řeší, je dostupná přes Nástroje > Mosaic Updater.
Tento dotaz je vyřešený.