mirror of
https://github.com/anklimov/lighthub
synced 2025-12-08 12:49:50 +03:00
Merge pull request #32 from MykhailoKh/develop-add-modbus-register-type-parameter
Add modbus register type parameter
This commit is contained in:
@@ -26,5 +26,7 @@
|
|||||||
# export FLAGS="$FLAGS -DDHCP_RETRY_INTERVAL=60000"
|
# export FLAGS="$FLAGS -DDHCP_RETRY_INTERVAL=60000"
|
||||||
# export FLAGS="$FLAGS -DRESTART_LAN_ON_MQTT_ERRORS"
|
# export FLAGS="$FLAGS -DRESTART_LAN_ON_MQTT_ERRORS"
|
||||||
# export FLAGS="$FLAGS -DW5500_CS_PIN=53"
|
# export FLAGS="$FLAGS -DW5500_CS_PIN=53"
|
||||||
|
# export FLAGS="$FLAGS -DINTERVAL_CHECK_INPUT=20"
|
||||||
|
# export FLAGS="$FLAGS -DMODBUS_DIMMER_PARAM=SERIAL_8N1"
|
||||||
export FLAGS="$FLAGS -DPIO_SRC_REV="$(git log --pretty=format:%h_%ad -1 --date=short)
|
export FLAGS="$FLAGS -DPIO_SRC_REV="$(git log --pretty=format:%h_%ad -1 --date=short)
|
||||||
echo $FLAGS
|
echo $FLAGS
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ e-mail anklimov@gmail.com
|
|||||||
|
|
||||||
#include "inputs.h"
|
#include "inputs.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
|
#include "utils.h"
|
||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
|
|
||||||
#ifndef DHT_DISABLE
|
#ifndef DHT_DISABLE
|
||||||
|
|||||||
@@ -574,14 +574,16 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send) {
|
|||||||
case CH_MODBUS: {
|
case CH_MODBUS: {
|
||||||
short numpar=0;
|
short numpar=0;
|
||||||
if ((itemArg->type == aJson_Array) && ((numpar = aJson.getArraySize(itemArg)) >= 2)) {
|
if ((itemArg->type == aJson_Array) && ((numpar = aJson.getArraySize(itemArg)) >= 2)) {
|
||||||
int _addr = aJson.getArrayItem(itemArg, 0)->valueint;
|
int _addr = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_ADDR)->valueint;
|
||||||
int _reg = aJson.getArrayItem(itemArg, 1)->valueint;
|
int _reg = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_REG)->valueint;
|
||||||
int _mask = -1;
|
int _mask = -1;
|
||||||
if (numpar >= 3) _mask = aJson.getArrayItem(itemArg, 2)->valueint;
|
if (numpar >= (MODBUS_CMD_ARG_MASK+1)) _mask = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_MASK)->valueint;
|
||||||
int _maxval = 0x3f;
|
int _maxval = 0x3f;
|
||||||
if (numpar >=4) _maxval = aJson.getArrayItem(itemArg, 3)->valueint;
|
if (numpar >= (MODBUS_CMD_ARG_MAX_SCALE+1)) _maxval = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_MAX_SCALE)->valueint;
|
||||||
if (_maxval) modbusDimmerSet(_addr, _reg, _mask, map(Par[0], 0, 100, 0, _maxval));
|
int _regType = MODBUS_HOLDING_REG_TYPE;
|
||||||
else modbusDimmerSet(_addr, _reg, _mask, Par[0]);
|
if (numpar >= (MODBUS_CMD_ARG_REG_TYPE+1)) _regType = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_REG_TYPE)->valueint;
|
||||||
|
if (_maxval) modbusDimmerSet(_addr, _reg, _regType, _mask, map(Par[0], 0, 100, 0, _maxval));
|
||||||
|
else modbusDimmerSet(_addr, _reg, _regType, _mask, Par[0]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -886,7 +888,11 @@ int Item::VacomSetHeat(int addr, int8_t val, int8_t cmd) {
|
|||||||
modbusBusy = 0;
|
modbusBusy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::modbusDimmerSet(int addr, uint16_t _reg, int _mask, uint16_t value) {
|
int Item::modbusDimmerSet(int addr, uint16_t _reg, int _regType, int _mask, uint16_t value) {
|
||||||
|
|
||||||
|
if (_regType != MODBUS_COIL_REG_TYPE || _regType != MODBUS_HOLDING_REG_TYPE) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (modbusBusy) {
|
if (modbusBusy) {
|
||||||
mb_fail(3, addr, value, 0);
|
mb_fail(3, addr, value, 0);
|
||||||
@@ -895,7 +901,7 @@ int Item::modbusDimmerSet(int addr, uint16_t _reg, int _mask, uint16_t value) {
|
|||||||
};
|
};
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
modbusSerial.begin(9600, dimPar);
|
modbusSerial.begin(MODBUS_SERIAL_BAUD, dimPar);
|
||||||
node.begin(addr, modbusSerial);
|
node.begin(addr, modbusSerial);
|
||||||
|
|
||||||
|
|
||||||
@@ -912,10 +918,22 @@ int Item::modbusDimmerSet(int addr, uint16_t _reg, int _mask, uint16_t value) {
|
|||||||
Serial.print(addr);
|
Serial.print(addr);
|
||||||
Serial.print(F("=>"));
|
Serial.print(F("=>"));
|
||||||
Serial.print(_reg, HEX);
|
Serial.print(_reg, HEX);
|
||||||
Serial.print(F(":"));
|
Serial.print(F("(T:"));
|
||||||
|
Serial.print(_regType);
|
||||||
|
Serial.print(F("):"));
|
||||||
Serial.println(value, HEX);
|
Serial.println(value, HEX);
|
||||||
|
|
||||||
node.writeSingleRegister(_reg, value);
|
switch (_regType) {
|
||||||
|
case MODBUS_HOLDING_REG_TYPE:
|
||||||
|
node.writeSingleRegister(_reg, value);
|
||||||
|
break;
|
||||||
|
case MODBUS_COIL_REG_TYPE:
|
||||||
|
node.writeSingleCoil(_reg, value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Serial.println(F("Not supported reg type"));
|
||||||
|
}
|
||||||
|
|
||||||
modbusBusy = 0;
|
modbusBusy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1033,6 +1051,7 @@ boolean Item::checkModbusRetry() {
|
|||||||
if (cmd & CMD_RETRY) { // if last sending attempt of command was failed
|
if (cmd & CMD_RETRY) { // if last sending attempt of command was failed
|
||||||
int val = getVal();
|
int val = getVal();
|
||||||
Serial.println(F("Retrying CMD"));
|
Serial.println(F("Retrying CMD"));
|
||||||
|
|
||||||
cmd &= ~CMD_RETRY; // Clean retry flag
|
cmd &= ~CMD_RETRY; // Clean retry flag
|
||||||
Ctrl(cmd,1,&val); // Execute command again
|
Ctrl(cmd,1,&val); // Execute command again
|
||||||
return true;
|
return true;
|
||||||
@@ -1043,23 +1062,53 @@ return false;
|
|||||||
int Item::checkModbusDimmer() {
|
int Item::checkModbusDimmer() {
|
||||||
if (modbusBusy) return -1;
|
if (modbusBusy) return -1;
|
||||||
if (checkModbusRetry()) return -2;
|
if (checkModbusRetry()) return -2;
|
||||||
|
|
||||||
|
short numpar = 0;
|
||||||
|
if ((itemArg->type != aJson_Array) || ((numpar = aJson.getArraySize(itemArg)) < 2)) {
|
||||||
|
Serial.println(F("Illegal arguments"));
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
uint8_t result;
|
uint8_t result;
|
||||||
|
|
||||||
uint16_t addr = getArg(0);
|
uint16_t addr = getArg(MODBUS_CMD_ARG_ADDR);
|
||||||
uint16_t reg = getArg(1);
|
uint16_t reg = getArg(MODBUS_CMD_ARG_REG);
|
||||||
|
int _regType = MODBUS_HOLDING_REG_TYPE;
|
||||||
|
if (numpar >= (MODBUS_CMD_ARG_REG_TYPE+1)) _regType = aJson.getArrayItem(itemArg, MODBUS_CMD_ARG_REG_TYPE)->valueint;
|
||||||
// short mask = getArg(2);
|
// short mask = getArg(2);
|
||||||
|
// Serial.print(F("Modbus polling "));
|
||||||
|
// Serial.print(addr);
|
||||||
|
// Serial.print(F("=>"));
|
||||||
|
// Serial.print(reg, HEX);
|
||||||
|
// Serial.print(F("(T:"));
|
||||||
|
// Serial.print(_regType);
|
||||||
|
// Serial.println(F(")"));
|
||||||
|
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
//node.setSlave(addr);
|
//node.setSlave(addr);
|
||||||
|
|
||||||
modbusSerial.begin(9600, dimPar);
|
modbusSerial.begin(MODBUS_SERIAL_BAUD, dimPar);
|
||||||
node.begin(addr, modbusSerial);
|
node.begin(addr, modbusSerial);
|
||||||
|
|
||||||
|
switch (_regType) {
|
||||||
result = node.readHoldingRegisters(reg, 1);
|
case MODBUS_HOLDING_REG_TYPE:
|
||||||
|
result = node.readHoldingRegisters(reg, 1);
|
||||||
|
break;
|
||||||
|
case MODBUS_COIL_REG_TYPE:
|
||||||
|
result = node.readCoils(reg, 1);
|
||||||
|
break;
|
||||||
|
case MODBUS_DISCRETE_REG_TYPE:
|
||||||
|
result = node.readDiscreteInputs(reg, 1);
|
||||||
|
break;
|
||||||
|
case MODBUS_INPUT_REG_TYPE:
|
||||||
|
result = node.readInputRegisters(reg, 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Serial.println(F("Not supported reg type"));
|
||||||
|
}
|
||||||
|
|
||||||
if (result == node.ku8MBSuccess) {
|
if (result == node.ku8MBSuccess) {
|
||||||
data = node.getResponseBuffer(0);
|
data = node.getResponseBuffer(0);
|
||||||
|
|||||||
@@ -53,6 +53,17 @@ e-mail anklimov@gmail.com
|
|||||||
#define I_CMD 3 //Latest CMD received
|
#define I_CMD 3 //Latest CMD received
|
||||||
#define I_EXT 4 //Chanell-depended extension - array
|
#define I_EXT 4 //Chanell-depended extension - array
|
||||||
|
|
||||||
|
#define MODBUS_CMD_ARG_ADDR 0
|
||||||
|
#define MODBUS_CMD_ARG_REG 1
|
||||||
|
#define MODBUS_CMD_ARG_MASK 2
|
||||||
|
#define MODBUS_CMD_ARG_MAX_SCALE 3
|
||||||
|
#define MODBUS_CMD_ARG_REG_TYPE 4
|
||||||
|
|
||||||
|
#define MODBUS_COIL_REG_TYPE 0
|
||||||
|
#define MODBUS_DISCRETE_REG_TYPE 1
|
||||||
|
#define MODBUS_HOLDING_REG_TYPE 2
|
||||||
|
#define MODBUS_INPUT_REG_TYPE 3
|
||||||
|
|
||||||
#include "aJSON.h"
|
#include "aJSON.h"
|
||||||
|
|
||||||
extern aJsonObject *items;
|
extern aJsonObject *items;
|
||||||
@@ -114,7 +125,7 @@ class Item
|
|||||||
protected:
|
protected:
|
||||||
int VacomSetFan (int8_t val, int8_t cmd=0);
|
int VacomSetFan (int8_t val, int8_t cmd=0);
|
||||||
int VacomSetHeat(int addr, int8_t val, int8_t cmd=0);
|
int VacomSetHeat(int addr, int8_t val, int8_t cmd=0);
|
||||||
int modbusDimmerSet(int addr, uint16_t _reg, int _mask, uint16_t value);
|
int modbusDimmerSet(int addr, uint16_t _reg, int _regType, int _mask, uint16_t value);
|
||||||
void mb_fail(short addr, short op, int val, int cmd);
|
void mb_fail(short addr, short op, int val, int cmd);
|
||||||
int isActive();
|
int isActive();
|
||||||
void Parse();
|
void Parse();
|
||||||
|
|||||||
@@ -477,8 +477,8 @@ void onInitialStateInitLAN() {
|
|||||||
#if defined(__AVR__) || defined(__SAM3X8E__)||defined(ARDUINO_ARCH_STM32F1)
|
#if defined(__AVR__) || defined(__SAM3X8E__)||defined(ARDUINO_ARCH_STM32F1)
|
||||||
#ifdef W5500_CS_PIN
|
#ifdef W5500_CS_PIN
|
||||||
Ethernet.w5500_cspin = W5500_CS_PIN;
|
Ethernet.w5500_cspin = W5500_CS_PIN;
|
||||||
debugSerial<<F("Use W5500 pin: "));
|
debugSerial<<"Use W5500 pin: ";
|
||||||
debugSerial<<Ethernet.w5500_cspin);
|
debugSerial<<(Ethernet.w5500_cspin);
|
||||||
#endif
|
#endif
|
||||||
IPAddress ip, dns, gw, mask;
|
IPAddress ip, dns, gw, mask;
|
||||||
int res = 1;
|
int res = 1;
|
||||||
@@ -553,8 +553,8 @@ void softRebootFunc(){
|
|||||||
|
|
||||||
void resetHard() {
|
void resetHard() {
|
||||||
#ifdef RESET_PIN
|
#ifdef RESET_PIN
|
||||||
debugSerial<<F("Reset Arduino with digital pin "));
|
debugSerial<<"Reset Arduino with digital pin ";
|
||||||
debugSerial<<QUOTE(RESET_PIN));
|
debugSerial<<QUOTE(RESET_PIN);
|
||||||
delay(500);
|
delay(500);
|
||||||
pinMode(RESET_PIN, OUTPUT);
|
pinMode(RESET_PIN, OUTPUT);
|
||||||
digitalWrite(RESET_PIN,LOW);
|
digitalWrite(RESET_PIN,LOW);
|
||||||
@@ -1182,7 +1182,7 @@ void printFirmwareVersionAndBuildOptions() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RESET_PIN
|
#ifdef RESET_PIN
|
||||||
debugSerial<<F("\n(+)HARDRESET on pin=")<<F(QUOTE(RESET_PIN);
|
debugSerial<<"\n(+)HARDRESET on pin="<<QUOTE(RESET_PIN);
|
||||||
#else
|
#else
|
||||||
debugSerial<<F("\n(-)HARDRESET, using soft");
|
debugSerial<<F("\n(-)HARDRESET, using soft");
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,7 +29,9 @@
|
|||||||
#define OFFSET_MQTT_PWD OFFSET_CONFIGSERVER+32
|
#define OFFSET_MQTT_PWD OFFSET_CONFIGSERVER+32
|
||||||
#define EEPROM_offset OFFSET_MQTT_PWD+16
|
#define EEPROM_offset OFFSET_MQTT_PWD+16
|
||||||
|
|
||||||
|
#ifndef INTERVAL_CHECK_INPUT
|
||||||
#define INTERVAL_CHECK_INPUT 50
|
#define INTERVAL_CHECK_INPUT 50
|
||||||
|
#endif
|
||||||
#define INTERVAL_CHECK_MODBUS 2000
|
#define INTERVAL_CHECK_MODBUS 2000
|
||||||
#define INTERVAL_POLLING 100
|
#define INTERVAL_POLLING 100
|
||||||
#define THERMOSTAT_CHECK_PERIOD 5000
|
#define THERMOSTAT_CHECK_PERIOD 5000
|
||||||
@@ -42,7 +44,11 @@
|
|||||||
#define MODBUS_SERIAL_BAUD 9600
|
#define MODBUS_SERIAL_BAUD 9600
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define dimPar SERIAL_8E1
|
#ifndef MODBUS_DIMMER_PARAM
|
||||||
|
#define MODBUS_DIMMER_PARAM SERIAL_8E1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define dimPar MODBUS_DIMMER_PARAM
|
||||||
#define fmPar SERIAL_8N1
|
#define fmPar SERIAL_8N1
|
||||||
|
|
||||||
#ifndef SERIAL_BAUD
|
#ifndef SERIAL_BAUD
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
[platformio]
|
[platformio]
|
||||||
src_dir = lighthub
|
src_dir = lighthub
|
||||||
env_default =
|
env_default =
|
||||||
; megaatmega2560
|
megaatmega2560
|
||||||
megaatmega2560-net
|
; megaatmega2560-net
|
||||||
; due
|
; due
|
||||||
; esp8266
|
; esp8266
|
||||||
; esp32
|
; esp32
|
||||||
@@ -112,7 +112,7 @@ lib_deps =
|
|||||||
https://github.com/anklimov/CmdArduino
|
https://github.com/anklimov/CmdArduino
|
||||||
https://github.com/anklimov/ModbusMaster
|
https://github.com/anklimov/ModbusMaster
|
||||||
https://github.com/anklimov/DMXSerial
|
https://github.com/anklimov/DMXSerial
|
||||||
https://github.com/anklimov/Ethernet
|
https://github.com/anklimov/Ethernet2
|
||||||
https://github.com/PaulStoffregen/SPI.git
|
https://github.com/PaulStoffregen/SPI.git
|
||||||
https://github.com/knolleary/pubsubclient.git
|
https://github.com/knolleary/pubsubclient.git
|
||||||
https://github.com/anklimov/Artnet.git
|
https://github.com/anklimov/Artnet.git
|
||||||
@@ -122,6 +122,7 @@ lib_deps =
|
|||||||
DHT sensor library
|
DHT sensor library
|
||||||
https://github.com/arcao/Syslog.git
|
https://github.com/arcao/Syslog.git
|
||||||
Streaming
|
Streaming
|
||||||
|
https://github.com/Chris--A/PrintEx.git
|
||||||
|
|
||||||
[env:esp8266]
|
[env:esp8266]
|
||||||
platform = espressif8266
|
platform = espressif8266
|
||||||
|
|||||||
Reference in New Issue
Block a user