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

Dependencies:   mbed

Fork of TAIST_modbus by Supachai Vorapojpisut

Committer:
paicaloid
Date:
Sun Mar 18 07:27:10 2018 +0000
Revision:
5:8998772b4971
Parent:
4:774fe9cd0748
Child:
6:b6d3e73ad56f
remove print

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