From 77a07b1aee63f8d2817bba984fc433332b6dcc4d Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Fri, 21 Oct 2022 11:19:30 +0200 Subject: [PATCH] add set and read functions over modbus --- main.c | 99 ++++++++++++++----------------------------------------- modbus-master.c | 12 +++++++ modbus-master.h | 2 +- modbus_io_slave.c | 67 +++++++++++++++++++++++++++++++++++++ modbus_io_slave.h | 10 ++++++ 5 files changed, 115 insertions(+), 75 deletions(-) create mode 100644 modbus_io_slave.c create mode 100644 modbus_io_slave.h diff --git a/main.c b/main.c index 6f8b3f0..c7a4760 100644 --- a/main.c +++ b/main.c @@ -18,6 +18,7 @@ #include "mqtt.h" #include "modbus.h" #include "modbus-master.h" +#include "modbus_io_slave.h" #include "util/delay.h" @@ -135,71 +136,6 @@ void send_values(void){ } -void modbus_set_Output(uint8_t slave_adr, uint8_t nr, uint8_t state) { - switch (state) { - case BLINK: - //ioHelperSetBit(outStatesBlinking, nr, ON); - writeCoil(slave_adr,100+nr,1); - wait_write(10); - break; - //case TOGGLE: - // ioHelperSetBit(outStatesBlinking, nr, OFF); - // if (ioHelperReadBit(outStates, nr)) { - // ioHelperSetBit(outStates, nr, OFF); - // } else { - // ioHelperSetBit(outStates, nr, ON); - // } - // break; - case ON: - //ioHelperSetBit(outStates, nr, ON); - //ioHelperSetBit(outStatesBlinking, nr, OFF); - writeCoil(slave_adr,nr,1); - wait_write(10); - break; - case OFF: - writeCoil(slave_adr,nr,0); - wait_write(10); - //ioHelperSetBit(outStates, nr, OFF); - //ioHelperSetBit(outStatesBlinking, nr, OFF); - break; - } -} - -uint8_t modbus_read_Input(uint8_t nr, uint8_t type) { - uint8_t state = 0; - switch (type) { - case LEVEL: - state = ioHelperReadBit(inStates, nr); - break; - case EDGE: - state = ioHelperReadBit(inStatesBothEdges, nr); - ioHelperSetBit(inStatesBothEdges, nr, 0); - break; - case RISING: - state = ioHelperReadBit(inStatesRisingEdge, nr); - ioHelperSetBit(inStatesRisingEdge, nr, 0); - break; - case FALLING: - state = ioHelperReadBit(inStatesFallingEdge, nr); - ioHelperSetBit(inStatesFallingEdge, nr, 0); - break; - } - - //reset edges after being read once - // if (state) { - // if (type == EDGE) - // ioHelperSetBit(inStatesBothEdges, nr, OFF); - // if (type == RISING) - // ioHelperSetBit(inStatesRisingEdge, nr, OFF); - // if (type == FALLING) - // ioHelperSetBit(inStatesFallingEdge, nr, OFF); - // } - - return state; -} - - - int main(){ // INIT MCU avr_init(); @@ -260,6 +196,7 @@ int main(){ uint32_t timer_blink_outs = millis(); uint32_t timer_send_uptime = millis(); uint32_t timer_send_info = millis(); + uint32_t timer_read_slave = millis(); //printf("anlage: %x\n\r", read_Input(IN_ANLAGE_EIN_INV, LEVEL)); @@ -282,20 +219,34 @@ int main(){ do_kraftsensor(); +#if PLC_MQTT_ENABLED char msg[64]; sprintf(msg, "%d", kraftsensor_value); mqtt_pub(&mqtt_client, "/Filamentanlage/01_Extruder/kraft", msg, strlen(msg)); +#endif + + modbus_io_set_Output(4, 0, TOGGLE); + } + + if(millis() - timer_read_slave > 100){ + timer_read_slave = millis(); + //readInputState(4, 200, 32); + modbus_io_read(); + + if(modbus_io_read_Input(16, RISING)) + modbus_io_set_Output(4, 3, ON); + if(modbus_io_read_Input(17, RISING)) + modbus_io_set_Output(4, 3, OFF); - //tgl ^= 0x01; - //modbus_set_Output(4, 0, OFF); - //modbus_set_Output(4, 1, ON); - //modbus_set_Output(4, 2, BLINK); - //modbus_set_Output(4, 3, tgl); - //readInputReg(4, 0, 1); - //uint16_t inp; - //wait_receive(1, &inp, 100); - //printf("read inputs: 0x%X\n", inp); + //printf("read inputs: 0x%02X 0x%02X 0x%02X 0x%02X\n", inp[3], inp[2], inp[1], inp[0]); + } + + if(read_Input(BTN_HEIZEN_AN, RISING)){ + modbus_io_set_Output(4, MOD_OUT_HEIZEN_LED, 1); + } + if(read_Input(BTN_HEIZEN_AUS, RISING)){ + modbus_io_set_Output(4, MOD_OUT_HEIZEN_LED, 0); } #if PLC_MQTT_ENABLED diff --git a/modbus-master.c b/modbus-master.c index cde854b..3d70c71 100644 --- a/modbus-master.c +++ b/modbus-master.c @@ -97,6 +97,18 @@ void readInputReg(uint8_t slaveid, uint16_t address, uint16_t amount) { modbusSendMessage(5); } +void readInputState(uint8_t slaveid, uint16_t address, uint16_t amount) { + _delay_ms(2); + rxbuffer[0]=slaveid; + modbusSetAddress(slaveid); + rxbuffer[1]=0x02; + rxbuffer[2]=(address>>8)&0xFF; + rxbuffer[3]=address&0xFF; + rxbuffer[4]=0; + rxbuffer[5]=amount; + modbusSendMessage(5); +} + void writeCoil(uint8_t slaveid, uint16_t address, uint16_t value) { _delay_ms(2); rxbuffer[0]=slaveid; diff --git a/modbus-master.h b/modbus-master.h index 0072ec0..11bb5d0 100644 --- a/modbus-master.h +++ b/modbus-master.h @@ -7,5 +7,5 @@ int8_t wait_write(uint8_t timeout); void readReg(uint8_t slaveid, uint16_t address, uint8_t amount); void writeReg(uint8_t slaveid, uint16_t address, uint16_t value); void readInputReg(uint8_t slaveid, uint16_t address, uint16_t amount); -void readInputStatus(uint8_t slaveid, uint16_t address, uint16_t amount); +void readInputState(uint8_t slaveid, uint16_t address, uint16_t amount); void writeCoil(uint8_t slaveid, uint16_t address, uint16_t value); diff --git a/modbus_io_slave.c b/modbus_io_slave.c new file mode 100644 index 0000000..65f8595 --- /dev/null +++ b/modbus_io_slave.c @@ -0,0 +1,67 @@ +#include "avrIOhelper/io-helper.h" +#include "modbus-master.h" + +#define IO_SLAVE_ADDR 0x04 + +volatile uint8_t modbus_io_inStates[4]; +volatile uint8_t modbus_io_inStatesBothEdges[4]; +volatile uint8_t modbus_io_inStatesRisingEdge[4]; +volatile uint8_t modbus_io_inStatesFallingEdge[4]; + +void modbus_io_read(){ + readInputReg(IO_SLAVE_ADDR, 0, 2); + wait_receive(2, (void*)modbus_io_inStates, 100); + + readInputReg(IO_SLAVE_ADDR, 100, 2); + wait_receive(2, (void*)modbus_io_inStatesBothEdges, 100); + + readInputReg(IO_SLAVE_ADDR, 200, 2); + wait_receive(2, (void*)modbus_io_inStatesFallingEdge, 100); + + readInputReg(IO_SLAVE_ADDR, 300, 2); + wait_receive(2, (void*)modbus_io_inStatesRisingEdge, 100); +} + +void modbus_io_set_Output(uint8_t slave_adr, uint8_t nr, uint8_t state) { + switch (state) { + case BLINK: + writeCoil(slave_adr,100+nr,1); + wait_write(10); + break; + //case TOGGLE: + // ioHelperSetBit(outStatesBlinking, nr, OFF); + // if (ioHelperReadBit(outStates, nr)) { + // ioHelperSetBit(outStates, nr, OFF); + // } else { + // ioHelperSetBit(outStates, nr, ON); + // } + // break; + case ON: + writeCoil(slave_adr,nr,1); + wait_write(10); + break; + case OFF: + writeCoil(slave_adr,nr,0); + wait_write(10); + break; + } +} + +uint8_t modbus_io_read_Input(uint8_t nr, uint8_t type) { + uint8_t state = 0; + switch (type) { + case LEVEL: + state = ioHelperReadBit(modbus_io_inStates, nr); + break; + case EDGE: + state = ioHelperReadBit(modbus_io_inStatesBothEdges, nr); + break; + case RISING: + state = ioHelperReadBit(modbus_io_inStatesFallingEdge, nr); + break; + case FALLING: + state = ioHelperReadBit(modbus_io_inStatesRisingEdge, nr); + break; + } + return state; +} diff --git a/modbus_io_slave.h b/modbus_io_slave.h new file mode 100644 index 0000000..e413ae9 --- /dev/null +++ b/modbus_io_slave.h @@ -0,0 +1,10 @@ +#ifndef _MODBUS_IO_SLAVE_H_ +#define _MODBUS_IO_SLAVE_H_ + +#include + +void modbus_io_read(void); +void modbus_io_set_Output(uint8_t slave_adr, uint8_t nr, uint8_t state); +uint8_t modbus_io_read_Input(uint8_t nr, uint8_t type); + +#endif