ModBus TCP Implementation

Fork of HTTPD by AMETEK Powervar

Committer:
gulchi
Date:
Fri Jun 30 08:17:01 2017 +0000
Revision:
3:ebea8e061ae6
Parent:
2:fcd20e2cd110
Child:
4:41ee166a0e6c
Working ModBusTCP Interface with Mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d18dff347122 1 /* Copyright (C) 2013 Hiroshi Suga, MIT License
okini3939 0:d18dff347122 2 *
okini3939 0:d18dff347122 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
okini3939 0:d18dff347122 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
okini3939 0:d18dff347122 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
okini3939 0:d18dff347122 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
okini3939 0:d18dff347122 7 * furnished to do so, subject to the following conditions:
okini3939 0:d18dff347122 8 *
okini3939 0:d18dff347122 9 * The above copyright notice and this permission notice shall be included in all copies or
okini3939 0:d18dff347122 10 * substantial portions of the Software.
okini3939 0:d18dff347122 11 *
okini3939 0:d18dff347122 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
okini3939 0:d18dff347122 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
okini3939 0:d18dff347122 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
okini3939 0:d18dff347122 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
okini3939 0:d18dff347122 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
okini3939 0:d18dff347122 17 */
okini3939 0:d18dff347122 18
gulchi 2:fcd20e2cd110 19 #ifndef MODBUS_TCP_H
gulchi 2:fcd20e2cd110 20 #define MODBUS_TCP
okini3939 0:d18dff347122 21
okini3939 0:d18dff347122 22 #include "mbed.h"
okini3939 0:d18dff347122 23 #include "rtos.h"
dgriffin65 1:b724fdb741e7 24 #include "NetworkStack.h"
gulchi 3:ebea8e061ae6 25 #include "EthernetInterface.h"
gulchi 3:ebea8e061ae6 26 //#include "CBuffer.h"
okini3939 0:d18dff347122 27
gulchi 3:ebea8e061ae6 28 //#define DEBUG
okini3939 0:d18dff347122 29
gulchi 2:fcd20e2cd110 30 #define MODBUS_TCP_PORT 502
gulchi 3:ebea8e061ae6 31 #define MODBUS_MAX_CLIENTS 3
gulchi 2:fcd20e2cd110 32 #define MODBUS_KEEPALIVE 10
gulchi 3:ebea8e061ae6 33 #define MODBUS_TIMEOUT 50000
gulchi 3:ebea8e061ae6 34 #define MODBUS_MAX_HANDLES 2
gulchi 3:ebea8e061ae6 35
gulchi 3:ebea8e061ae6 36 #define MODBUS_MAX_REGISTER 256
gulchi 3:ebea8e061ae6 37
okini3939 0:d18dff347122 38
gulchi 2:fcd20e2cd110 39 #define MODBUS_CMD_SIZE 100
gulchi 3:ebea8e061ae6 40 #define MODBUS_BUF_SIZE 128
gulchi 2:fcd20e2cd110 41 #define MODBUS_STACK_SIZE (1024 * 6)
gulchi 3:ebea8e061ae6 42 //efine HTTPD_ENABLE_CLOSER
okini3939 0:d18dff347122 43
okini3939 0:d18dff347122 44 //Debug is disabled by default
okini3939 0:d18dff347122 45 #if defined(DEBUG) and (!defined(TARGET_LPC11U24))
okini3939 0:d18dff347122 46 #define DBG(x, ...) std::printf("[DBG]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d18dff347122 47 #define WARN(x, ...) std::printf("[WARN]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d18dff347122 48 #define ERR(x, ...) std::printf("[ERR]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d18dff347122 49 #define INFO(x, ...) std::printf("[INFO]" x "\r\n", ##__VA_ARGS__);
okini3939 0:d18dff347122 50 #else
okini3939 0:d18dff347122 51 #define DBG(x, ...)
okini3939 0:d18dff347122 52 #define WARN(x, ...)
okini3939 0:d18dff347122 53 #define ERR(x, ...)
okini3939 0:d18dff347122 54 #define INFO(x, ...)
okini3939 0:d18dff347122 55 #endif
okini3939 0:d18dff347122 56
okini3939 0:d18dff347122 57
gulchi 2:fcd20e2cd110 58 class Modbus {
okini3939 0:d18dff347122 59 public:
okini3939 0:d18dff347122 60
okini3939 0:d18dff347122 61 struct STATE {
okini3939 0:d18dff347122 62 Thread *thread;
dgriffin65 1:b724fdb741e7 63 TCPSocket *client;
gulchi 3:ebea8e061ae6 64 //volatile Request req;
gulchi 3:ebea8e061ae6 65 //CircBuffer <char>*buf;
gulchi 2:fcd20e2cd110 66
gulchi 3:ebea8e061ae6 67 char start_message[8];
gulchi 2:fcd20e2cd110 68
okini3939 0:d18dff347122 69 };
okini3939 0:d18dff347122 70
gulchi 2:fcd20e2cd110 71 Modbus ();
okini3939 0:d18dff347122 72
gulchi 3:ebea8e061ae6 73 int start (EthernetInterface *ns, int port = MODBUS_TCP_PORT);
okini3939 0:d18dff347122 74
okini3939 0:d18dff347122 75 // --- HTTPD_req.cpp ---
okini3939 0:d18dff347122 76 void httpdError (int id, int err);
okini3939 0:d18dff347122 77
gulchi 2:fcd20e2cd110 78
okini3939 0:d18dff347122 79 // --- HTTPD_util.cpp ---
dgriffin65 1:b724fdb741e7 80 TCPSocket *getClientSocket(int id) {
gulchi 3:ebea8e061ae6 81 if (id >= MODBUS_MAX_CLIENTS) return NULL;
dgriffin65 1:b724fdb741e7 82 return _state[id].client;
dgriffin65 1:b724fdb741e7 83 }
gulchi 3:ebea8e061ae6 84 int send (int id, unsigned short buffer[], int len);
gulchi 3:ebea8e061ae6 85
gulchi 3:ebea8e061ae6 86 int attachRead (void (*funcCgi)(int id, unsigned short start_address, unsigned short length), int startRegister = 0);
okini3939 0:d18dff347122 87
gulchi 2:fcd20e2cd110 88 static Modbus * getInstance() {
okini3939 0:d18dff347122 89 return _inst;
okini3939 0:d18dff347122 90 };
okini3939 0:d18dff347122 91
okini3939 0:d18dff347122 92 private :
gulchi 2:fcd20e2cd110 93 static Modbus *_inst;
okini3939 0:d18dff347122 94 Thread *_daemon;
dgriffin65 1:b724fdb741e7 95 TCPServer _server;
dgriffin65 1:b724fdb741e7 96
gulchi 3:ebea8e061ae6 97 EthernetInterface *m_ns;
okini3939 0:d18dff347122 98
gulchi 2:fcd20e2cd110 99 #ifdef MODBUS_ENABLE_CLOSER
gulchi 2:fcd20e2cd110 100 struct STATE _state[MODBUS_MAX_CLIENTS + 1];
okini3939 0:d18dff347122 101 #else
gulchi 2:fcd20e2cd110 102 struct STATE _state[MODBUS_MAX_CLIENTS];
okini3939 0:d18dff347122 103 #endif
okini3939 0:d18dff347122 104
okini3939 0:d18dff347122 105 struct HANDLER {
gulchi 3:ebea8e061ae6 106 int startRegister;
gulchi 3:ebea8e061ae6 107 void (*funcCgiRead)(int id, unsigned short start_address, unsigned short length);
gulchi 3:ebea8e061ae6 108 void (*funcCgiWrite)(int id);
gulchi 2:fcd20e2cd110 109 } _handler[MODBUS_MAX_HANDLES];
okini3939 0:d18dff347122 110
okini3939 0:d18dff347122 111 int _handler_count;
okini3939 0:d18dff347122 112
dgriffin65 1:b724fdb741e7 113 static void daemon ();
okini3939 0:d18dff347122 114 static void child (void const *arg);
okini3939 0:d18dff347122 115 static void closer (void const *arg);
okini3939 0:d18dff347122 116
okini3939 0:d18dff347122 117 // --- HTTPD_req.cpp ---
gulchi 3:ebea8e061ae6 118
gulchi 3:ebea8e061ae6 119 void recvData (int id, char buf[], int size);
gulchi 3:ebea8e061ae6 120 int mb_exception_handler(int id, char data_in[], unsigned short length, char error);
okini3939 0:d18dff347122 121
gulchi 2:fcd20e2cd110 122
okini3939 0:d18dff347122 123
okini3939 0:d18dff347122 124 // --- HTTPD_util.cpp ---
gulchi 3:ebea8e061ae6 125 int getHandler (int startRegister);
gulchi 3:ebea8e061ae6 126 int sendToClient(int id, char buffer[], unsigned short len);
okini3939 0:d18dff347122 127 int from_hex (int ch);
okini3939 0:d18dff347122 128 int to_hex (int code);
okini3939 0:d18dff347122 129 };
okini3939 0:d18dff347122 130
okini3939 0:d18dff347122 131 #endif