Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed
Fork of ICE by
Diff: src/ModbusMaster/ModbusMaster.cpp
- Revision:
- 190:af7ab603c9fe
- Parent:
- 189:546b04f89b19
- Child:
- 197:594afd088f32
--- a/src/ModbusMaster/ModbusMaster.cpp Wed Oct 05 21:51:01 2016 +0000
+++ b/src/ModbusMaster/ModbusMaster.cpp Thu Oct 06 15:24:10 2016 +0000
@@ -9,6 +9,7 @@
#include "MTSLog.h"
#include "BLEDataHandler.h"
#include "ModbusMaster.h"
+#include "mod.h"
#include "MbedJSONValue.h"
DigitalOut dout1(PC_1);
@@ -32,9 +33,9 @@
bool status;
RegisterType_t regType;
- modbus_init(MB_BAUD_RATE);
- DigitalOut flu_power(PA_11);
- flu_power = 0; // provide power to the modbus
+ mod_init();
+ DigitalOut mod_power(PA_11);
+ mod_power = 0; // provide power to the modbus
while( true ) {
@@ -100,7 +101,7 @@
ModbusRegisterMap[id].rfreq = atoi(json_value["rfreq"].get<std::string>().c_str());
ModbusRegisterMap[id].regType = regType;
ModbusRegisterMap[id].simulated = false;
- ModbusRegisterMap[id].valid = true;
+ ModbusRegisterMap[id].errflag = 0;
if( (regType == REG_TYPE_VINPUT) || (regType == REG_TYPE_VOUTPUT) ) {
ModbusRegisterMap[id].vcmd = json_value["vcmd"].get<std::string>().c_str();
}
@@ -143,32 +144,40 @@
}
if( iter->second.node != 0 ) {
-
+ unsigned char rd_buf[10];
+ memset( rd_buf, 0, 10 );
logInfo("Processing Input: tag=%s, node=%d, reg=%d, size=%d, order=%d", iter->first.c_str(), iter->second.node, iter->second.reg, iter->second.size, iter->second.order );
- SendModbusCommand(iter->second.node, iter->second.reg, iter->second.size);
- Thread::wait(30);
+ int ret = mod_read(iter->second.node, iter->second.rtype, iter->second.reg, iter->second.size, rd_buf);
switch( iter->second.type ) {
case TYPE_32BIT_FLOAT:
float float_value;
- status = ReadModbus_32bit_float( &float_value, iter->second.order );
+ if( ret != MOD_ERROR_NONE ) {
+ ModbusRegisterMap[iter->first].errflag = ret;
+ break;
+ }
+ status = ReadModbus_32bit_float( &float_value, iter->second.order, rd_buf );
if( status == true ) {
ModbusRegisterMap[iter->first].float_value = float_value;
- ModbusRegisterMap[iter->first].valid = true;
+ ModbusRegisterMap[iter->first].errflag = 0;
// logInfo("Modbus Tag:%s value=%2.2f", iter->first.c_str(), float_value );
} else {
- ModbusRegisterMap[iter->first].valid = false;
+ ModbusRegisterMap[iter->first].errflag = 1000;
// logInfo("Modbus Read Failed, tag=%s", iter->first.c_str() );
}
break;
case TYPE_32BIT_INT:
int32_t int32_value;
- status = ReadModbus_32bit_int( &int32_value, iter->second.order );
+ if( ret != MOD_ERROR_NONE ) {
+ ModbusRegisterMap[iter->first].errflag = ret;
+ break;
+ }
+ status = ReadModbus_32bit_int( &int32_value, iter->second.order, rd_buf );
if( status == true ) {
ModbusRegisterMap[iter->first].float_value = int32_value;
- ModbusRegisterMap[iter->first].valid = true;
+ ModbusRegisterMap[iter->first].errflag = 0;
logInfo("Modbus Tag:%s value=%2.2f", iter->first.c_str(), ModbusRegisterMap[iter->first].float_value );
} else {
- ModbusRegisterMap[iter->first].valid = false;
+ ModbusRegisterMap[iter->first].errflag = 1000;
logInfo("Modbus Read Failed, tag=%s", iter->first.c_str() );
}
break;
@@ -266,119 +275,22 @@
}
}
-
-volatile char modbus_buffer_char;
-volatile bool modbus_interrupt_complete = false;
-
-uint8_t modbus_input_buffer[SIZE_MB_BUFFER];// 1byte address + 1 byte function +1 byte number of regs + 12 bytes of data + 2 bytes for crc response frame from slave
-volatile uint8_t modbus_input_buffer_counter = 0;
-
-//Frame crc calucation
-uint16_t modbus_crc(uint8_t* buf, int len)
-{
- uint16_t crc = 0xFFFF;
-
- for (int pos = 0; pos < len; pos++) {
- crc ^= (uint16_t)buf[pos]; // XOR byte into least sig. byte of crc
-
- for (int i = 8; i != 0; i--) {
- // Loop over each bit
- if ((crc & 0x0001) != 0) {
- // If the LSB is set
- crc >>= 1; // Shift right and XOR 0xA001
- crc ^= 0xA001;
- } else // Else LSB is not set
- crc >>= 1; // Just shift right
- }
- }
- // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
- return crc;
-}
-
-RawSerial modbus(PA_2, PA_3);
-DigitalOut mod_de(PB_0);
-DigitalOut mod_re(PB_1);
-
-void modbus_init( uint16_t baudRate )
-{
- modbus.baud(baudRate);
- modbus.attach(&modbus_recv, RawSerial::RxIrq);
-}
-
-//call back when character goes into RX buffer for RS485 modbus
-void modbus_recv()
-{
-
- if (modbus.readable()) {
- modbus_buffer_char = modbus.getc();
- if (modbus_input_buffer_counter == 0 && modbus_buffer_char == 0x00) {
- modbus_input_buffer_counter = 0;
- } else {
- modbus_input_buffer[modbus_input_buffer_counter] = modbus_buffer_char;
- modbus_input_buffer_counter++;
- }
- }
-
- if (modbus_input_buffer_counter > modbus_input_buffer[2] + 4) {
- modbus_interrupt_complete = true;
- modbus_input_buffer_counter = 0;
- }
-}
-
-// Read modbus master frame
-void SendModbusCommand(uint8_t slave_address, uint16_t firstReg, uint16_t noRegs)
-{
- uint8_t L1V[8] = {slave_address, 0x04, 0x00, 0x02, 0x00, 0x02, 0xD1, 0x16};
-
- L1V[2] = (firstReg >> 8) & 0xFF;
- L1V[3] = firstReg & 0xFF;
- L1V[4] = (noRegs >> 8) & 0xFF;
- L1V[5] = noRegs & 0xFF;
- L1V[6] = modbus_crc(L1V,6) & 0xFF;
- L1V[7] = (modbus_crc(L1V,6)>>8) & 0xFF;
-
- mod_de = 1;
- mod_re = 1;
- Thread::wait(1);
- for (uint8_t i = 0; i < 8; i++)
- modbus.putc(L1V[i]);
-
- Thread::wait(2);
- mod_de = 0;
- mod_re = 0;
-
-}
-
-bool mbInterruptComplete()
-{
- if (modbus_interrupt_complete) {
- modbus_interrupt_complete = false;
- return true;
- } else {
- return false;
- }
-}
-
-bool ReadModbus_32bit_float( float *float_value, int order )
+bool ReadModbus_32bit_float( float *float_value, int order, unsigned char *rd_buf )
{
MR_REGISTER_32_BIT_FLOAT value;
- if (mbInterruptComplete() != true ) {
- return false;
- }
-
switch( order ) {
case BigEndian:
- value.b.lo_lo = modbus_input_buffer[6];
- value.b.lo_hi = modbus_input_buffer[5];
- value.b.hi_lo = modbus_input_buffer[4];
- value.b.hi_hi = modbus_input_buffer[3];
+ value.b.lo_lo = rd_buf[3];
+ value.b.lo_hi = rd_buf[2];
+ value.b.hi_lo = rd_buf[1];
+ value.b.hi_hi = rd_buf[0];
break;
case BigEndianReverseWord:
- value.b.lo_lo = modbus_input_buffer[4];
- value.b.lo_hi = modbus_input_buffer[3];
- value.b.hi_lo = modbus_input_buffer[6];
- value.b.hi_hi = modbus_input_buffer[5];
+ value.b.lo_lo = rd_buf[1];
+ value.b.lo_hi = rd_buf[0];
+ value.b.hi_lo = rd_buf[3];
+ value.b.hi_hi = rd_buf[2];
break;
default:
return false;
@@ -388,26 +300,22 @@
return true;
}
-bool ReadModbus_32bit_int( int32_t *int32_value, int order )
+bool ReadModbus_32bit_int( int32_t *int32_value, int order, unsigned char *rd_buf )
{
MR_REGISTER_32BIT_INT value;
- if (mbInterruptComplete() != true ) {
- return false;
- }
-
switch( order ) {
case BigEndian:
- value.b.lo_lo = modbus_input_buffer[6];
- value.b.lo_hi = modbus_input_buffer[5];
- value.b.hi_lo = modbus_input_buffer[4];
- value.b.hi_hi = modbus_input_buffer[3];
+ value.b.lo_lo = rd_buf[3];
+ value.b.lo_hi = rd_buf[2];
+ value.b.hi_lo = rd_buf[1];
+ value.b.hi_hi = rd_buf[0];
break;
case BigEndianReverseWord:
- value.b.lo_lo = modbus_input_buffer[4];
- value.b.lo_hi = modbus_input_buffer[3];
- value.b.hi_lo = modbus_input_buffer[6];
- value.b.hi_hi = modbus_input_buffer[5];
+ value.b.lo_lo = rd_buf[1];
+ value.b.lo_hi = rd_buf[0];
+ value.b.hi_lo = rd_buf[3];
+ value.b.hi_hi = rd_buf[2];
break;
default:
return false;
