From 01abbf4a252e85af99df24ca01b7f7ab612ee245 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 5 Jun 2025 11:10:57 +0300 Subject: [PATCH] added "relay type 1" for non-standard 4-relay board (based on STM8S003) --- modbus_relay/cmdlnopts.c | 1 + modbus_relay/cmdlnopts.h | 1 + modbus_relay/main.c | 34 ++++++++++++++++++++++++++-------- modbus_relay/modbus_relay | Bin 21424 -> 0 bytes 4 files changed, 28 insertions(+), 8 deletions(-) delete mode 100755 modbus_relay/modbus_relay diff --git a/modbus_relay/cmdlnopts.c b/modbus_relay/cmdlnopts.c index 043910a..d545713 100644 --- a/modbus_relay/cmdlnopts.c +++ b/modbus_relay/cmdlnopts.c @@ -57,6 +57,7 @@ static sl_option_t cmdlnopts[] = { {"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"}, {"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 }; diff --git a/modbus_relay/cmdlnopts.h b/modbus_relay/cmdlnopts.h index 8072fa4..c3810c2 100644 --- a/modbus_relay/cmdlnopts.h +++ b/modbus_relay/cmdlnopts.h @@ -31,6 +31,7 @@ typedef struct{ int nodenum; // node number (default: 1) int readn; // read node number int setn; // set node number + int relaytype; // type of relay int **setrelay; // set relay number N int **resetrelay; // reset relay number N int **getinput; // read Nth input diff --git a/modbus_relay/main.c b/modbus_relay/main.c index e45fe9f..f43ba8c 100644 --- a/modbus_relay/main.c +++ b/modbus_relay/main.c @@ -46,13 +46,27 @@ int main(int argc, char **argv){ modbus_set_response_timeout(ctx, 0, 100000); 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(GP.relaytype < 0 || GP.relaytype > 1) ERRX("Type should be 0 or 1"); VMSG("OK!\n"); uint8_t dest8[8] = {0}; + int result = 0; + int ninputs = 8, noutputs = 8; + if(GP.relaytype == 1){ ninputs = 4; noutputs = 4;} if(GP.setall){ - memset(dest8, 1, 8); - if(modbus_write_bits(ctx, 0, 8, dest8) < 0) WARNX("Can't set all relays"); + if(GP.relaytype == 0){ + 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){ - 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{ if(GP.resetrelay){ int **p = GP.resetrelay; @@ -80,24 +94,24 @@ int main(int argc, char **argv){ } } 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{ int **p = GP.getinput; while(*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]); ++p; } } } 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{ int **p = GP.getrelay; while(*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]); ++p; } @@ -108,7 +122,11 @@ int main(int argc, char **argv){ } if(GP.setn){ uint16_t nodeN = (uint16_t) GP.setn; - modbus_write_registers(ctx, 0, 1, &nodeN); + if(GP.relaytype == 0){ + modbus_write_registers(ctx, 0, 1, &nodeN); + }else{ + modbus_write_register(ctx, 0x4000, nodeN); + } modbus_set_slave(ctx, nodeN); getN(ctx); } diff --git a/modbus_relay/modbus_relay b/modbus_relay/modbus_relay deleted file mode 100755 index 11464bbd6e9cb82cf6137e4636a93dafc8bc5370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21424 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