Téma: [vyřešeno] Modbus TCP a chyba -3
Dobrý den,
měl bych dotaz ohledně Modbus TCP na zařízení SDS-BIG.
Mám tento kód, který mi v pravidelných intervalech načítá data z FVE Victron přes Modbus TCP.
Jenomže vždy po nějakém čase (cca 2 dny) se stane to, že mi to přestane fungovat s chybou -3. Tím pádem každé další volání končí chybou -3 a jediné co v danou chvíli můžu udělat je, že musím restartovat SDS, pak to zase funguje.
Dočetl jsem se v návodu, že se jedná o chybu, kdy se volá nějaká Modbus funkce dříve, něž byla dokončena předchozí.
Vycházel jsem ze vzorového programu ze stránky http://wiki.merenienergie.cz/index.php/MODBUS_TCP, jen jsem kód trochu upravil.
Pravděpodobně nemám ošetřené všechny návratové hodnoty z volání funkce SDS_get_i32(12400) nebo SDS_get_i32(12404), ale nevím jaké. Neřešil někdy někdo něco podobného?
Pozn.
Napadla mě teď jedna věc, pokud by volání funkce modbus_tcp_read() skončilo s chybou, nedojde k zavolání funkce modbus_tcp_disconnect(), tím pádem při dalším zavolání funkce modbus_tcp_connect() to vrací vlastně -3, protože teoreticky by měl být stále připojen.
int readModbusTest() {
int error;
//pripojeni
modbus_tcp_connect(MODBUS_SERVER_IP[0], MODBUS_SERVER_IP[1], MODBUS_SERVER_IP[2], MODBUS_SERVER_IP[3], MODBUS_SERVER_PORT, 0);
while(1) {
error = SDS_get_i32(12400);
if(error < 0) {
printf("Chyba modbus_tcp_connect: %i\n", error);
return error;
}
if(error == 2) break;
}
modbus_tcp_read(242, 0x04, 4, 36);
while(1) {
error = SDS_get_i32(12404);
if(error < 0) {
printf("Chyba modbus_tcp_read: %i\n", error);
return error;
}
if(error == 0) break;
}
inNapetiL1 = SDS_get_i32(12470);
inNapetiL2 = SDS_get_i32(12471);
inNapetiL3 = SDS_get_i32(12472);
inProudL1 = SDS_get_i32(12473);
inProudL2 = SDS_get_i32(12474);
inProudL3 = SDS_get_i32(12475);
inFreqL1 = SDS_get_i32(12476);
inFreqL2 = SDS_get_i32(12477);
inFreqL3 = SDS_get_i32(12478);
//odpojeni
modbus_tcp_disconnect();
while(1) {
error = SDS_get_i32(12400);
if(error < 0) {
printf("Chyba modbus_tcp_disconnect: %i\n", error);
return error;
}
if(error != 4) break;
}
return 0;
}