Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

Committer:
davidjhoward
Date:
Wed Sep 07 18:26:56 2016 +0000
Revision:
15:a6ee32969e8e
Parent:
9:ef0ca2f8a8a6
Child:
23:03bf3d549002
modbus changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:65cfa4873284 1 /******************************************************************************
davidjhoward 4:c35db3946fd8 2 *
jmarkel44 0:65cfa4873284 3 * File: ModbusMaster.cpp
jmarkel44 0:65cfa4873284 4 * Desciption: source for the ICE Modbus Master
jmarkel44 0:65cfa4873284 5 *
jmarkel44 0:65cfa4873284 6 *****************************************************************************/
jmarkel44 0:65cfa4873284 7 #include "global.h"
jmarkel44 0:65cfa4873284 8 #include <stdio.h>
jmarkel44 0:65cfa4873284 9 #include "BLEDataHandler.h"
davidjhoward 4:c35db3946fd8 10 #include "ModbusMaster.h"
davidjhoward 8:abe51ae5ef8b 11 #include "MbedJSONValue.h"
jmarkel44 0:65cfa4873284 12
jmarkel44 0:65cfa4873284 13 /*****************************************************************************
jmarkel44 0:65cfa4873284 14 * Function: ModbusMaster
jmarkel44 0:65cfa4873284 15 * Description: entry point for the Modbus Master
jmarkel44 0:65cfa4873284 16 *
jmarkel44 0:65cfa4873284 17 * @param (IN) args (user-defined arguments)
jmarkel44 0:65cfa4873284 18 * @return none
jmarkel44 0:65cfa4873284 19 *****************************************************************************/
davidjhoward 7:c0c03193612d 20
jmarkel44 0:65cfa4873284 21 void ModbusMaster(void const *args)
jmarkel44 0:65cfa4873284 22 {
jmarkel44 0:65cfa4873284 23 printf("\r%s has started...\n", __func__);
davidjhoward 8:abe51ae5ef8b 24 char scratch_buf[1024];
davidjhoward 15:a6ee32969e8e 25 bool status;
davidjhoward 8:abe51ae5ef8b 26 MbedJSONValue json_value;
jmarkel44 0:65cfa4873284 27
davidjhoward 9:ef0ca2f8a8a6 28 // configure modbus registers based in all files that start with "input"
davidjhoward 8:abe51ae5ef8b 29 std::vector<mDot::mdot_file> file_list = GLOBAL_mdot->listUserFiles();
davidjhoward 8:abe51ae5ef8b 30 for (std::vector<mDot::mdot_file>::iterator i = file_list.begin(); i != file_list.end(); ++i) {
davidjhoward 8:abe51ae5ef8b 31 if( strncmp( i->name, "input", strlen("input")) == 0 ) {
davidjhoward 8:abe51ae5ef8b 32
davidjhoward 8:abe51ae5ef8b 33 printf("\r(%d)FOUND INPUT FILE: %s\n", __LINE__, i->name);
davidjhoward 8:abe51ae5ef8b 34
davidjhoward 8:abe51ae5ef8b 35 bool status = GLOBAL_mdot->readUserFile(i->name, (void *)scratch_buf, 1024);
davidjhoward 8:abe51ae5ef8b 36 if( status != true ) {
davidjhoward 8:abe51ae5ef8b 37 printf("\r(%d)read file failed, status=%d\n", __LINE__, status);
davidjhoward 8:abe51ae5ef8b 38 } else {
davidjhoward 8:abe51ae5ef8b 39 printf("\r(%d)Read File SUCCESS: %s\n", __LINE__, scratch_buf );
davidjhoward 8:abe51ae5ef8b 40 }
davidjhoward 8:abe51ae5ef8b 41
davidjhoward 8:abe51ae5ef8b 42 parse( json_value, scratch_buf );
davidjhoward 8:abe51ae5ef8b 43
davidjhoward 8:abe51ae5ef8b 44 std::string id = json_value["id"].get<std::string>().c_str();
davidjhoward 9:ef0ca2f8a8a6 45 ModbusRegisterMap[id].name = json_value["name"].get<std::string>().c_str();
davidjhoward 9:ef0ca2f8a8a6 46 ModbusRegisterMap[id].units = json_value["units"].get<std::string>().c_str();
davidjhoward 9:ef0ca2f8a8a6 47 ModbusRegisterMap[id].min = json_value["min"].get<double>();
davidjhoward 9:ef0ca2f8a8a6 48 ModbusRegisterMap[id].max = json_value["max"].get<double>();
davidjhoward 9:ef0ca2f8a8a6 49 ModbusRegisterMap[id].node = json_value["node"].get<int>();
davidjhoward 9:ef0ca2f8a8a6 50 ModbusRegisterMap[id].reg = json_value["reg"].get<int>();
davidjhoward 9:ef0ca2f8a8a6 51 ModbusRegisterMap[id].rtype = json_value["rtype"].get<int>();
davidjhoward 9:ef0ca2f8a8a6 52 ModbusRegisterMap[id].type = json_value["type"].get<int>();
davidjhoward 15:a6ee32969e8e 53 ModbusRegisterMap[id].size = json_value["size"].get<int>();
davidjhoward 15:a6ee32969e8e 54 ModbusRegisterMap[id].order = json_value["order"].get<int>();
davidjhoward 9:ef0ca2f8a8a6 55 ModbusRegisterMap[id].fmt = json_value["fmt"].get<std::string>().c_str();
davidjhoward 8:abe51ae5ef8b 56 }
davidjhoward 7:c0c03193612d 57 }
davidjhoward 7:c0c03193612d 58
davidjhoward 9:ef0ca2f8a8a6 59 // read modbus registers that have been configured.
jmarkel44 0:65cfa4873284 60 while ( true ) {
davidjhoward 9:ef0ca2f8a8a6 61
davidjhoward 9:ef0ca2f8a8a6 62 std::map<std::string, ModbusRegister>::iterator iter;
davidjhoward 9:ef0ca2f8a8a6 63 for (iter = ModbusRegisterMap.begin(); iter != ModbusRegisterMap.end(); ++iter) {
davidjhoward 15:a6ee32969e8e 64 printf("\rReading node=%d, reg=%d, size=%d, order=%d\n", iter->second.node, iter->second.reg, iter->second.size, iter->second.order );
davidjhoward 15:a6ee32969e8e 65 SendModbusCommand(iter->second.node, iter->second.reg, iter->second.size);
davidjhoward 15:a6ee32969e8e 66 osDelay(30);
davidjhoward 15:a6ee32969e8e 67
davidjhoward 15:a6ee32969e8e 68 switch( iter->second.type ) {
davidjhoward 15:a6ee32969e8e 69 case TYPE_32BIT_FLOAT:
davidjhoward 15:a6ee32969e8e 70 float float_value;
davidjhoward 15:a6ee32969e8e 71 status = ReadModbus_32bit_float( &float_value, iter->second.order );
davidjhoward 15:a6ee32969e8e 72 if( status == true )
davidjhoward 15:a6ee32969e8e 73 {
davidjhoward 15:a6ee32969e8e 74 ModbusRegisterMap[iter->first].float_value = float_value;
davidjhoward 15:a6ee32969e8e 75 }
davidjhoward 15:a6ee32969e8e 76 break;
davidjhoward 15:a6ee32969e8e 77 case TYPE_32BIT_INT:
davidjhoward 15:a6ee32969e8e 78 break;
davidjhoward 15:a6ee32969e8e 79 case TYPE_32BIT_UINT:
davidjhoward 15:a6ee32969e8e 80 break;
davidjhoward 15:a6ee32969e8e 81 case TYPE_16BIT_INT:
davidjhoward 15:a6ee32969e8e 82 break;
davidjhoward 15:a6ee32969e8e 83 case TYPE_16BIT_UINT:
davidjhoward 15:a6ee32969e8e 84 break;
davidjhoward 15:a6ee32969e8e 85 default:
davidjhoward 15:a6ee32969e8e 86 break;
davidjhoward 15:a6ee32969e8e 87 }
davidjhoward 4:c35db3946fd8 88 }
jmarkel44 0:65cfa4873284 89 }
davidjhoward 4:c35db3946fd8 90 }
davidjhoward 4:c35db3946fd8 91
davidjhoward 4:c35db3946fd8 92
davidjhoward 4:c35db3946fd8 93 volatile char modbus_buffer_char;
davidjhoward 4:c35db3946fd8 94 volatile bool modbus_interrupt_complete = false;
davidjhoward 4:c35db3946fd8 95
davidjhoward 4:c35db3946fd8 96 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
davidjhoward 4:c35db3946fd8 97 volatile uint8_t modbus_input_buffer_counter = 0;
davidjhoward 4:c35db3946fd8 98
davidjhoward 4:c35db3946fd8 99 //Frame crc calucation
davidjhoward 4:c35db3946fd8 100 uint16_t modbus_crc(uint8_t* buf, int len)
davidjhoward 4:c35db3946fd8 101 {
davidjhoward 4:c35db3946fd8 102 uint16_t crc = 0xFFFF;
davidjhoward 4:c35db3946fd8 103
davidjhoward 4:c35db3946fd8 104 for (int pos = 0; pos < len; pos++) {
davidjhoward 4:c35db3946fd8 105 crc ^= (uint16_t)buf[pos]; // XOR byte into least sig. byte of crc
davidjhoward 4:c35db3946fd8 106
davidjhoward 4:c35db3946fd8 107 for (int i = 8; i != 0; i--) {
davidjhoward 4:c35db3946fd8 108 // Loop over each bit
davidjhoward 4:c35db3946fd8 109 if ((crc & 0x0001) != 0) {
davidjhoward 4:c35db3946fd8 110 // If the LSB is set
davidjhoward 4:c35db3946fd8 111 crc >>= 1; // Shift right and XOR 0xA001
davidjhoward 4:c35db3946fd8 112 crc ^= 0xA001;
davidjhoward 4:c35db3946fd8 113 } else // Else LSB is not set
davidjhoward 4:c35db3946fd8 114 crc >>= 1; // Just shift right
davidjhoward 4:c35db3946fd8 115 }
davidjhoward 4:c35db3946fd8 116 }
davidjhoward 4:c35db3946fd8 117 // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
davidjhoward 4:c35db3946fd8 118 return crc;
davidjhoward 4:c35db3946fd8 119 }
davidjhoward 4:c35db3946fd8 120
davidjhoward 4:c35db3946fd8 121 RawSerial modbus(PA_2, PA_3);
davidjhoward 4:c35db3946fd8 122 DigitalOut modbus_enable0(PB_0);
davidjhoward 4:c35db3946fd8 123 DigitalOut modbus_enable1(PB_1);
davidjhoward 4:c35db3946fd8 124
davidjhoward 4:c35db3946fd8 125 void modbus_init( uint16_t baudRate )
davidjhoward 4:c35db3946fd8 126 {
davidjhoward 4:c35db3946fd8 127 modbus.baud(baudRate);
davidjhoward 4:c35db3946fd8 128 modbus.attach(&modbus_recv, RawSerial::RxIrq);
davidjhoward 4:c35db3946fd8 129 }
davidjhoward 4:c35db3946fd8 130
davidjhoward 4:c35db3946fd8 131 //call back when character goes into RX buffer for RS485 modbus
davidjhoward 4:c35db3946fd8 132 void modbus_recv()
davidjhoward 4:c35db3946fd8 133 {
davidjhoward 4:c35db3946fd8 134
davidjhoward 4:c35db3946fd8 135 if (modbus.readable()) {
davidjhoward 4:c35db3946fd8 136 modbus_buffer_char = modbus.getc();
davidjhoward 4:c35db3946fd8 137 if (modbus_input_buffer_counter == 0 && modbus_buffer_char == 0x00) {
davidjhoward 4:c35db3946fd8 138 modbus_input_buffer_counter = 0;
davidjhoward 4:c35db3946fd8 139 } else {
davidjhoward 4:c35db3946fd8 140 modbus_input_buffer[modbus_input_buffer_counter] = modbus_buffer_char;
davidjhoward 4:c35db3946fd8 141 modbus_input_buffer_counter++;
davidjhoward 4:c35db3946fd8 142 }
davidjhoward 4:c35db3946fd8 143 }
davidjhoward 4:c35db3946fd8 144
davidjhoward 4:c35db3946fd8 145 if (modbus_input_buffer_counter > modbus_input_buffer[2] + 4) {
davidjhoward 4:c35db3946fd8 146 modbus_interrupt_complete = true;
davidjhoward 4:c35db3946fd8 147 modbus_input_buffer_counter = 0;
davidjhoward 4:c35db3946fd8 148 }
davidjhoward 4:c35db3946fd8 149 }
davidjhoward 4:c35db3946fd8 150
davidjhoward 4:c35db3946fd8 151 // Read modbus master frame
davidjhoward 9:ef0ca2f8a8a6 152 void SendModbusCommand(uint8_t slave_address, uint16_t firstReg, uint16_t noRegs)
davidjhoward 4:c35db3946fd8 153 {
davidjhoward 4:c35db3946fd8 154 uint8_t L1V[8] = {slave_address, 0x04, 0x00, 0x02, 0x00, 0x02, 0xD1, 0x16};
davidjhoward 4:c35db3946fd8 155
davidjhoward 4:c35db3946fd8 156 L1V[2] = (firstReg >> 8) & 0xFF;
davidjhoward 4:c35db3946fd8 157 L1V[3] = firstReg & 0xFF;
davidjhoward 4:c35db3946fd8 158 L1V[4] = (noRegs >> 8) & 0xFF;
davidjhoward 4:c35db3946fd8 159 L1V[5] = noRegs & 0xFF;
davidjhoward 4:c35db3946fd8 160 L1V[6] = modbus_crc(L1V,6) & 0xFF;
davidjhoward 4:c35db3946fd8 161 L1V[7] = (modbus_crc(L1V,6)>>8) & 0xFF;
davidjhoward 4:c35db3946fd8 162
davidjhoward 4:c35db3946fd8 163 modbus_enable0 = 1;
davidjhoward 4:c35db3946fd8 164 modbus_enable1 = 1;
davidjhoward 4:c35db3946fd8 165
davidjhoward 4:c35db3946fd8 166 for (uint8_t i = 0; i < 8; i++)
davidjhoward 4:c35db3946fd8 167 modbus.putc(L1V[i]);
davidjhoward 4:c35db3946fd8 168
davidjhoward 4:c35db3946fd8 169 wait_ms(2);
davidjhoward 4:c35db3946fd8 170 modbus_enable0 = 0;
davidjhoward 4:c35db3946fd8 171 modbus_enable1 = 0;
davidjhoward 4:c35db3946fd8 172
davidjhoward 4:c35db3946fd8 173 }
davidjhoward 4:c35db3946fd8 174
davidjhoward 4:c35db3946fd8 175 bool mbInterruptComplete()
davidjhoward 4:c35db3946fd8 176 {
davidjhoward 4:c35db3946fd8 177 if (modbus_interrupt_complete) {
davidjhoward 4:c35db3946fd8 178 modbus_interrupt_complete = false;
davidjhoward 4:c35db3946fd8 179 return true;
davidjhoward 4:c35db3946fd8 180 } else {
davidjhoward 4:c35db3946fd8 181 return false;
davidjhoward 4:c35db3946fd8 182 }
davidjhoward 4:c35db3946fd8 183 }
davidjhoward 4:c35db3946fd8 184
davidjhoward 15:a6ee32969e8e 185 bool ReadModbus_32bit_float( float *float_value, int order )
davidjhoward 4:c35db3946fd8 186 {
davidjhoward 15:a6ee32969e8e 187 MR_REGISTER_32_BIT_FLOAT value;
davidjhoward 15:a6ee32969e8e 188
davidjhoward 4:c35db3946fd8 189 if (mbInterruptComplete() != true ) {
davidjhoward 4:c35db3946fd8 190 return false;
davidjhoward 4:c35db3946fd8 191 }
davidjhoward 4:c35db3946fd8 192
davidjhoward 15:a6ee32969e8e 193 switch( order ) {
davidjhoward 15:a6ee32969e8e 194 case BigEndian:
davidjhoward 15:a6ee32969e8e 195 value.b.lo_lo = modbus_input_buffer[6];
davidjhoward 15:a6ee32969e8e 196 value.b.lo_hi = modbus_input_buffer[5];
davidjhoward 15:a6ee32969e8e 197 value.b.hi_lo = modbus_input_buffer[4];
davidjhoward 15:a6ee32969e8e 198 value.b.hi_hi = modbus_input_buffer[3];
davidjhoward 15:a6ee32969e8e 199 break;
davidjhoward 15:a6ee32969e8e 200 case BigEndianReverseWord:
davidjhoward 15:a6ee32969e8e 201 value.b.lo_lo = modbus_input_buffer[4];
davidjhoward 15:a6ee32969e8e 202 value.b.lo_hi = modbus_input_buffer[3];
davidjhoward 15:a6ee32969e8e 203 value.b.hi_lo = modbus_input_buffer[6];
davidjhoward 15:a6ee32969e8e 204 value.b.hi_hi = modbus_input_buffer[5];
davidjhoward 15:a6ee32969e8e 205 break;
davidjhoward 15:a6ee32969e8e 206 default:
davidjhoward 15:a6ee32969e8e 207 return false;
davidjhoward 15:a6ee32969e8e 208 }
davidjhoward 15:a6ee32969e8e 209 *float_value = value.f;
davidjhoward 4:c35db3946fd8 210 return true;
davidjhoward 4:c35db3946fd8 211 }