Merge pull request #32 from MykhailoKh/develop-add-modbus-register-type-parameter

Add modbus register type parameter
This commit is contained in:
2018-10-18 20:45:45 +03:00
committed by GitHub
7 changed files with 95 additions and 25 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);
switch (_regType) {
case MODBUS_HOLDING_REG_TYPE:
node.writeSingleRegister(_reg, value); 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) {
case MODBUS_HOLDING_REG_TYPE:
result = node.readHoldingRegisters(reg, 1); 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);

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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