added "relay type 1" for non-standard 4-relay board (based on STM8S003)

This commit is contained in:
Edward Emelianov 2025-06-05 11:10:57 +03:00
parent 1a3dba4676
commit 01abbf4a25
4 changed files with 28 additions and 8 deletions

View File

@ -57,6 +57,7 @@ static sl_option_t cmdlnopts[] = {
{"node", NEED_ARG, NULL, 'n', arg_int, APTR(&GP.nodenum), "node number (default: 1)"}, {"node", NEED_ARG, NULL, 'n', arg_int, APTR(&GP.nodenum), "node number (default: 1)"},
{"readN", NO_ARGS, NULL, 0, arg_int, APTR(&GP.readn), "read node number"}, {"readN", NO_ARGS, NULL, 0, arg_int, APTR(&GP.readn), "read node number"},
{"setN", NEED_ARG, NULL, 0, arg_int, APTR(&GP.setn), "change node number"}, {"setN", NEED_ARG, NULL, 0, arg_int, APTR(&GP.setn), "change node number"},
{"type", NEED_ARG, NULL, 't', arg_int, APTR(&GP.relaytype), "type of relay: 0 - standard 2relay, 1 - non-standard 4relay"},
end_option end_option
}; };

View File

@ -31,6 +31,7 @@ typedef struct{
int nodenum; // node number (default: 1) int nodenum; // node number (default: 1)
int readn; // read node number int readn; // read node number
int setn; // set node number int setn; // set node number
int relaytype; // type of relay
int **setrelay; // set relay number N int **setrelay; // set relay number N
int **resetrelay; // reset relay number N int **resetrelay; // reset relay number N
int **getinput; // read Nth input int **getinput; // read Nth input

View File

@ -46,13 +46,27 @@ int main(int argc, char **argv){
modbus_set_response_timeout(ctx, 0, 100000); modbus_set_response_timeout(ctx, 0, 100000);
if(modbus_set_slave(ctx, GP.nodenum)) ERRX("Can't set modbus slave"); if(modbus_set_slave(ctx, GP.nodenum)) ERRX("Can't set modbus slave");
if(modbus_connect(ctx) < 0) ERR("Can't open device %s", GP.device); if(modbus_connect(ctx) < 0) ERR("Can't open device %s", GP.device);
if(GP.relaytype < 0 || GP.relaytype > 1) ERRX("Type should be 0 or 1");
VMSG("OK!\n"); VMSG("OK!\n");
uint8_t dest8[8] = {0}; uint8_t dest8[8] = {0};
int result = 0;
int ninputs = 8, noutputs = 8;
if(GP.relaytype == 1){ ninputs = 4; noutputs = 4;}
if(GP.setall){ if(GP.setall){
memset(dest8, 1, 8); if(GP.relaytype == 0){
if(modbus_write_bits(ctx, 0, 8, dest8) < 0) WARNX("Can't set all relays"); memset(dest8, 1, noutputs);
result = modbus_write_bits(ctx, 0, noutputs, dest8);
}else{
result = modbus_write_bit(ctx, 0xff, 0xff00);
}
if(result < 0) WARNX("Can't set all relays");
}else if(GP.resetall){ }else if(GP.resetall){
if(modbus_write_bits(ctx, 0, 8, dest8) < 0) WARNX("Can't clear all relays"); if(GP.relaytype == 0){
result = modbus_write_bits(ctx, 0, noutputs, dest8);
}else{
result = modbus_write_bit(ctx, 0xff, 0);
}
if(result < 0) WARNX("Can't clear all relays");
}else{ }else{
if(GP.resetrelay){ if(GP.resetrelay){
int **p = GP.resetrelay; int **p = GP.resetrelay;
@ -80,24 +94,24 @@ int main(int argc, char **argv){
} }
} }
if(GP.getinput){ if(GP.getinput){
if(modbus_read_input_bits(ctx, 0, 8, dest8) < 0) WARNX("Can't read inputs"); if(modbus_read_input_bits(ctx, 0, ninputs, dest8) < 0) WARNX("Can't read inputs");
else{ else{
int **p = GP.getinput; int **p = GP.getinput;
while(*p){ while(*p){
int n = **p; int n = **p;
if(n > 7 || n < 0) WARNX("Input number should be in [0, 7]"); if(n > ninputs-1 || n < 0) WARNX("Input number should be in [0, %d]", ninputs-1);
else printf("INPUT%d=%u\n", n, dest8[n]); else printf("INPUT%d=%u\n", n, dest8[n]);
++p; ++p;
} }
} }
} }
if(GP.getrelay){ if(GP.getrelay){
if(modbus_read_bits(ctx, 0, 8, dest8) < 0) WARNX("Can't read relays"); if(modbus_read_bits(ctx, 0, noutputs, dest8) < 0) WARNX("Can't read relays");
else{ else{
int **p = GP.getrelay; int **p = GP.getrelay;
while(*p){ while(*p){
int n = **p; int n = **p;
if(n > 7 || n < 0) WARNX("Relay number should be in [0, 7]"); if(n > noutputs-1 || n < 0) WARNX("Relay number should be in [0, %d]", noutputs-1);
else printf("RELAY%d=%u\n", n, dest8[n]); else printf("RELAY%d=%u\n", n, dest8[n]);
++p; ++p;
} }
@ -108,7 +122,11 @@ int main(int argc, char **argv){
} }
if(GP.setn){ if(GP.setn){
uint16_t nodeN = (uint16_t) GP.setn; uint16_t nodeN = (uint16_t) GP.setn;
if(GP.relaytype == 0){
modbus_write_registers(ctx, 0, 1, &nodeN); modbus_write_registers(ctx, 0, 1, &nodeN);
}else{
modbus_write_register(ctx, 0x4000, nodeN);
}
modbus_set_slave(ctx, nodeN); modbus_set_slave(ctx, nodeN);
getN(ctx); getN(ctx);
} }

Binary file not shown.