พัทธนันทน์ ศรีสุขนันทน์ / Mbed 2 deprecated TAIST_modbus

Dependencies:   mbed

Fork of TAIST_modbus by Supachai Vorapojpisut

Committer:
KRiTiRK
Date:
Wed Mar 21 09:09:40 2018 +0000
Revision:
7:cba97341e790
Parent:
6:b6d3e73ad56f
to kokokokokkokokkokokokookokoookoookokokokookori

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsupacha 0:f306cb0263a6 1 #include "mbed.h"
vsupacha 0:f306cb0263a6 2 #include "modbus.h"
vsupacha 0:f306cb0263a6 3
KRiTiRK 7:cba97341e790 4 //RawSerial pc2(PC_6,PC_7);
KRiTiRK 7:cba97341e790 5 uint8_t nodeId = 4;
vsupacha 0:f306cb0263a6 6 uint16_t regValue[ADDR_RANGE];
vsupacha 0:f306cb0263a6 7
vsupacha 0:f306cb0263a6 8 enum state {IDLE, RECEPTION, END} protState = IDLE;
vsupacha 0:f306cb0263a6 9
vsupacha 0:f306cb0263a6 10 int process_buffer(char *buf, uint8_t *frame)
vsupacha 0:f306cb0263a6 11 {
vsupacha 0:f306cb0263a6 12 int status = 0;
vsupacha 0:f306cb0263a6 13 uint8_t sum = 0;
vsupacha 0:f306cb0263a6 14 uint8_t lrc, i;
vsupacha 0:f306cb0263a6 15 char tmpbuf[] = {0, 0, 0};
paicaloid 2:6d1f053a6033 16
vsupacha 0:f306cb0263a6 17 if (strlen(buf) == 14) {
vsupacha 0:f306cb0263a6 18 for (i = 0; i < 6; i++) {
vsupacha 0:f306cb0263a6 19 tmpbuf[0] = buf[i*2];
vsupacha 0:f306cb0263a6 20 tmpbuf[1] = buf[i*2 + 1];
vsupacha 0:f306cb0263a6 21 frame[i] = strtoul(tmpbuf, NULL, 16);
vsupacha 0:f306cb0263a6 22 }
vsupacha 0:f306cb0263a6 23 tmpbuf[0] = buf[12]; tmpbuf[1] = buf[13];
vsupacha 0:f306cb0263a6 24 lrc = strtoul(tmpbuf, NULL, 16);
vsupacha 0:f306cb0263a6 25 for (i = 0; i < 6; i++) {
vsupacha 0:f306cb0263a6 26 sum += frame[i];
vsupacha 0:f306cb0263a6 27 }
paicaloid 2:6d1f053a6033 28 sum = sum + lrc;
paicaloid 2:6d1f053a6033 29 if (sum == 0) {
vsupacha 0:f306cb0263a6 30 status = 1;
vsupacha 0:f306cb0263a6 31 }
vsupacha 0:f306cb0263a6 32 }
paicaloid 2:6d1f053a6033 33
vsupacha 0:f306cb0263a6 34 return status;
vsupacha 0:f306cb0263a6 35 }
vsupacha 0:f306cb0263a6 36
vsupacha 0:f306cb0263a6 37 void modbus_init(uint8_t id)
vsupacha 0:f306cb0263a6 38 {
paicaloid 2:6d1f053a6033 39 int i;
paicaloid 2:6d1f053a6033 40
vsupacha 0:f306cb0263a6 41 nodeId = id;
paicaloid 2:6d1f053a6033 42 for (i = 0; i < ADDR_RANGE; i++) {
paicaloid 2:6d1f053a6033 43 regValue[i] = 0;
paicaloid 2:6d1f053a6033 44 }
vsupacha 0:f306cb0263a6 45 }
vsupacha 0:f306cb0263a6 46
vsupacha 0:f306cb0263a6 47 uint16_t modbus_read(uint16_t offset)
paicaloid 2:6d1f053a6033 48 {
vsupacha 0:f306cb0263a6 49 if (offset < ADDR_RANGE) {
vsupacha 0:f306cb0263a6 50 return regValue[offset];
vsupacha 0:f306cb0263a6 51 }
paicaloid 2:6d1f053a6033 52 return 0;
vsupacha 0:f306cb0263a6 53 }
vsupacha 0:f306cb0263a6 54
vsupacha 0:f306cb0263a6 55 uint16_t modbus_update(uint8_t offset, uint16_t val)
vsupacha 0:f306cb0263a6 56 {
vsupacha 0:f306cb0263a6 57 uint16_t tmp;
vsupacha 0:f306cb0263a6 58
vsupacha 0:f306cb0263a6 59 if (offset < ADDR_RANGE) {
vsupacha 0:f306cb0263a6 60 tmp = regValue[offset];
vsupacha 0:f306cb0263a6 61 regValue[offset] = val;
vsupacha 0:f306cb0263a6 62 return tmp;
vsupacha 0:f306cb0263a6 63 }
paicaloid 2:6d1f053a6033 64 return 0;
paicaloid 2:6d1f053a6033 65 }
paicaloid 2:6d1f053a6033 66
paicaloid 2:6d1f053a6033 67 uint8_t modbus_check(uint16_t offset, uint16_t count)
paicaloid 2:6d1f053a6033 68 {
paicaloid 2:6d1f053a6033 69 uint8_t reg_map = 0x00;
paicaloid 2:6d1f053a6033 70 int i, j;
paicaloid 2:6d1f053a6033 71
paicaloid 2:6d1f053a6033 72 for (i = 0; i < ADDR_RANGE; i++) {
paicaloid 2:6d1f053a6033 73 for (j = offset; j < (offset+count); j++) {
paicaloid 2:6d1f053a6033 74 if (j == (ADDR_BASE + i)) {
paicaloid 2:6d1f053a6033 75 reg_map |= (1 << i);
paicaloid 2:6d1f053a6033 76 }
paicaloid 2:6d1f053a6033 77 }
paicaloid 2:6d1f053a6033 78 }
paicaloid 2:6d1f053a6033 79
paicaloid 2:6d1f053a6033 80 return reg_map;
vsupacha 0:f306cb0263a6 81 }
vsupacha 0:f306cb0263a6 82
vsupacha 0:f306cb0263a6 83 int modbus_parser(char ch, uint8_t *frame)
vsupacha 0:f306cb0263a6 84 {
vsupacha 0:f306cb0263a6 85 static char buf[514];
vsupacha 0:f306cb0263a6 86 static int idx = 0;
vsupacha 0:f306cb0263a6 87 static int status = 0;
vsupacha 0:f306cb0263a6 88
vsupacha 0:f306cb0263a6 89 switch(protState) {
vsupacha 0:f306cb0263a6 90 case IDLE:
vsupacha 0:f306cb0263a6 91 if (ch == ':') {
vsupacha 0:f306cb0263a6 92 protState = RECEPTION;
vsupacha 0:f306cb0263a6 93 idx = 0;
vsupacha 0:f306cb0263a6 94 status = 0;
vsupacha 0:f306cb0263a6 95 }
vsupacha 0:f306cb0263a6 96 break;
vsupacha 0:f306cb0263a6 97 case RECEPTION:
paicaloid 5:8998772b4971 98 // printf("%c", ch);
vsupacha 0:f306cb0263a6 99 if ((ch >= '0') && (ch <= '9')) {
vsupacha 0:f306cb0263a6 100 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 101 } else if ((ch >= 'a') && (ch <= 'f')) {
vsupacha 0:f306cb0263a6 102 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 103 } else if ((ch >= 'A') && (ch <= 'F')) {
vsupacha 0:f306cb0263a6 104 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 105 } else if (ch == '\r') {
vsupacha 0:f306cb0263a6 106 buf[idx] = 0;
vsupacha 0:f306cb0263a6 107 protState = END;
vsupacha 0:f306cb0263a6 108 } else {
vsupacha 0:f306cb0263a6 109 protState = IDLE;
vsupacha 0:f306cb0263a6 110 }
vsupacha 0:f306cb0263a6 111 break;
vsupacha 0:f306cb0263a6 112 case END:
vsupacha 0:f306cb0263a6 113 if (ch == '\n') {
vsupacha 0:f306cb0263a6 114 if (process_buffer(buf, frame)) {
vsupacha 0:f306cb0263a6 115 if ((frame[0] == nodeId) && (frame[1] == FUNC_CODE)) {
vsupacha 0:f306cb0263a6 116 status = 1;
vsupacha 0:f306cb0263a6 117 }
vsupacha 0:f306cb0263a6 118 }
vsupacha 0:f306cb0263a6 119 }
vsupacha 0:f306cb0263a6 120 protState = IDLE;
paicaloid 2:6d1f053a6033 121 break;
vsupacha 0:f306cb0263a6 122 default:
vsupacha 0:f306cb0263a6 123 protState = IDLE;
vsupacha 0:f306cb0263a6 124 }
vsupacha 0:f306cb0263a6 125
vsupacha 0:f306cb0263a6 126 return status;
vsupacha 0:f306cb0263a6 127 }
paicaloid 2:6d1f053a6033 128
paicaloid 2:6d1f053a6033 129 uint8_t calc_lrc(uint8_t *frame, int count)
paicaloid 2:6d1f053a6033 130 {
paicaloid 2:6d1f053a6033 131 int8_t lrc = 0;
paicaloid 2:6d1f053a6033 132 int i;
paicaloid 2:6d1f053a6033 133
paicaloid 2:6d1f053a6033 134 for (i = 0; i < count; i++) {
paicaloid 2:6d1f053a6033 135 lrc += frame[i];
paicaloid 2:6d1f053a6033 136 }
paicaloid 2:6d1f053a6033 137 return -lrc;
paicaloid 2:6d1f053a6033 138 }
paicaloid 2:6d1f053a6033 139
KRiTiRK 7:cba97341e790 140 void modbus_response(uint8_t reg_map, char *tmpPrint)
paicaloid 2:6d1f053a6033 141 {
paicaloid 2:6d1f053a6033 142 char fmt00[] = ":%02X%02X%02X\r\n";
paicaloid 2:6d1f053a6033 143 char fmt01[] = ":%02X%02X%02X%02X%02X\r\n";
paicaloid 2:6d1f053a6033 144 char fmt02[] = ":%02X%02X%02X%02X%02X\r\n";
paicaloid 2:6d1f053a6033 145 char fmt03[] = ":%02X%02X%02X%02X%02X%02X%02X\r\n";
paicaloid 2:6d1f053a6033 146 char *fmtstr;
paicaloid 2:6d1f053a6033 147 char str[20];
paicaloid 2:6d1f053a6033 148 uint8_t frame[ADDR_RANGE*2 + 3];
paicaloid 2:6d1f053a6033 149 uint16_t tmp;
paicaloid 2:6d1f053a6033 150
paicaloid 2:6d1f053a6033 151 frame[0] = nodeId;
paicaloid 2:6d1f053a6033 152 frame[1] = FUNC_CODE;
paicaloid 2:6d1f053a6033 153 switch(reg_map) {
paicaloid 2:6d1f053a6033 154 case 1:
paicaloid 2:6d1f053a6033 155 tmp = modbus_read(0);
paicaloid 2:6d1f053a6033 156 frame[2] = tmp >> 8;
paicaloid 2:6d1f053a6033 157 frame[3] = tmp & 0xFF;
paicaloid 2:6d1f053a6033 158 frame[4] = calc_lrc(frame, 4);
paicaloid 2:6d1f053a6033 159 fmtstr = fmt01;
KRiTiRK 7:cba97341e790 160 //sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]);
KRiTiRK 7:cba97341e790 161 sprintf(tmpPrint, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]);
KRiTiRK 7:cba97341e790 162 printf("%s", str);
KRiTiRK 7:cba97341e790 163 //pc2.printf("%s", str);
paicaloid 2:6d1f053a6033 164 break;
paicaloid 2:6d1f053a6033 165 case 2:
paicaloid 2:6d1f053a6033 166 tmp = modbus_read(1);
paicaloid 2:6d1f053a6033 167 frame[2] = tmp >> 8;
paicaloid 2:6d1f053a6033 168 frame[3] = tmp & 0xFF;
paicaloid 2:6d1f053a6033 169 frame[4] = calc_lrc(frame, 4);
paicaloid 2:6d1f053a6033 170 fmtstr = fmt02;
KRiTiRK 7:cba97341e790 171 //sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]);
KRiTiRK 7:cba97341e790 172 sprintf(tmpPrint, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]);
KRiTiRK 7:cba97341e790 173 printf("%s", str);
KRiTiRK 7:cba97341e790 174 //pc2.printf("%s", str);
paicaloid 2:6d1f053a6033 175 break;
paicaloid 2:6d1f053a6033 176 case 3:
paicaloid 2:6d1f053a6033 177 tmp = modbus_read(0);
paicaloid 2:6d1f053a6033 178 frame[2] = tmp >> 8;
paicaloid 2:6d1f053a6033 179 frame[3] = tmp & 0xFF;
paicaloid 2:6d1f053a6033 180 tmp = modbus_read(1);
paicaloid 2:6d1f053a6033 181 frame[4] = tmp >> 8;
paicaloid 2:6d1f053a6033 182 frame[5] = tmp & 0xFF;
paicaloid 2:6d1f053a6033 183 frame[6] = calc_lrc(frame, 6);
paicaloid 2:6d1f053a6033 184 fmtstr = fmt03;
KRiTiRK 7:cba97341e790 185 //sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]);
KRiTiRK 7:cba97341e790 186 sprintf(tmpPrint, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]);
paicaloid 5:8998772b4971 187 // printf("Response: %s", str);
KRiTiRK 7:cba97341e790 188 printf("%s", str);
KRiTiRK 7:cba97341e790 189 //pc2.printf("%s", str);
paicaloid 2:6d1f053a6033 190 break;
paicaloid 2:6d1f053a6033 191 default:
paicaloid 2:6d1f053a6033 192 fmtstr = fmt00;
paicaloid 2:6d1f053a6033 193 frame[2] = calc_lrc(frame, 2);
paicaloid 2:6d1f053a6033 194 sprintf(str, fmtstr, frame[0], frame[1], frame[2]);
paicaloid 5:8998772b4971 195 // printf("%s", str);
paicaloid 2:6d1f053a6033 196 }
paicaloid 2:6d1f053a6033 197 }