This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294XX ModBus TCP IP 编程器工作正常测试

Guru**** 2609895 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/762391/tm4c1294xx-modbus-tcp-ip-programin-engeria-working-ok-tested

主题中讨论的其他器件:Energia


#include
//////////// Modbus TCP / IP // quierido para Modbus TCP/IP ////////
#define maxInputRegister 20
#define maxHoldingRegister 20
#define MB_FC_none 0
#define MB_FC_READ_registers 3 //实现
#define MB_FC_WRITE_register 6 //实现
#define MB_FC_WRITE_MULTIPLE_REGISTERS" 16 //实现
//
// MODBUS 错误代码
//
#define MB_EC_NONE 0
#define MB_EC_ILLEGAL_FUNCTION 1
#define MB_EC_ILLEGAL_DATA_ADDRESS 2.
#define MB_EC_ILLEGAL_DATA_VALUE 3.
#define MB_EC_SLAVE_DEVICE_FAILURE 4.
//
// MODBUS MBAP 偏移
//
#define MB_tcp_TID 0
#define MB_tcp_PID 2.
#define MB_tcp_LEN 4.
#define MB_tcp_UID 6.
#define MB_tcp_FUNC 7.
#define MB_tcp_register_start 8.
#define MB_tcp_register_number 10.
字节 MAC[]={0xDE、0xAD、0xBE、0xEF、0xFE、 0xED };
IP 地址(192、168、1、177);
IP 地址网关(192、168、1、1);
ipaddress 子网(255、255、255、0);
int Modbustcp_port = 502;
字节字节字节字节阵列[260];
unsigned int MBHoldingRegister[maxHoldingRegister];

EthernetClient 客户端;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

EthernetServer MBServer (Modbustcp_port);

void setup(){

引脚模式(Pn_0、输出);

Serial.begin(9600);
延迟(100);
ethernet/enableLinkLed();
ethernet/enableActivityLed();
Ethernet.begin(mac、IP、网关、子网);
延迟(100);
serial.println(".");

MBServer.begin();
serial.println ("已连接");
serial.print ("ESP8266从属 Modbus TCP/IP ");
ip.printto (串行);
serial.print (":");
serial.println (字符串(Modbustcp_port));
serial.println ("Modbus TCP/IP Online");




void loop(){


//检查客户端是否已连接// Modbus TCP/IP
EthernetClient 客户端= MBServer.available ();
如果(!client){
返回;



布尔标志 ClientConnected = 0;
字节字节字节字节字节 byteFN = MB_FC_none;
Int Start;
整型 WordDataLength;
int ByteDataLength;
Int MessageLength;

// Modbus TCP/IP
while (client.connected()){

if (client.available ())

flagClientConnected = 1;
int i = 0;
while (client.available ())

ByteArray[i]= client.read();
i++;


client.flush();



////// 代码-- Codigo aqui

//////////////// 保持寄存器[0] A [9]= 10保持寄存器 Escritura
//////////////// 保持寄存器[0] A [9]= 10保持寄存器写入
int sensorValue1 = analogRead (24);
MBHoldingRegister[0]= sensorValue1;
MBHoldingRegister[1]= 10;
MBHoldingRegister[2]= 13;





//////////////// 保持寄存器[10] A [19]=10保持寄存器 Lectura
////// 保持寄存器[10] A [19]= 10保持寄存器读数

unsigned int Temporal[10];

时间[0]= MBHoldingRegister[10];
时间[1]= MBHoldingRegister[11];
时间[2]= MBHoldingRegister[12];
时间[3]= MBHoldingRegister[13];
时间[4]= MBHoldingRegister[14];
时间[5]= MBHoldingRegister[15];
Tempory[6]= MBHoldingRegister[16];
时间[7]= MBHoldingRegister[17];
时间[8]= MBHoldingRegister[18];
时间[9]= MBHoldingRegister[19];

///启用输出14
digitalWrite (PN_0、MBHoldingRegister[14]);


////调试

对于(int i = 0;i < 10;i++){

serial.print("[");
serial.print(i);
serial.print ("]);
serial.print (Temporal[i]);


serial.println("");




////结束代码- fin


//// rutine Modbus TCP
byteFN = ByteArray[MB_tcp_FUNC];
START =字(ByteArray[MB_tcp_register_start]、ByteArray[MB_tcp_register_start+1]);
WordDataLength =字(ByteArray[MB_tcp_register_number]、ByteArray[MB_tcp_register_number+1]);


//处理请求

switch (byteFN){
案例 MB_FC_none:
中断;

案例 MB_FC_Read_Registers:// 03读取保持寄存器
ByteDataLength = WordDataLength * 2;
ByteArray[5]= ByteDataLength + 3;//此字段之后的字节数。
ByteArray[8]= ByteDataLength;//这一个之后的字节数(或数据的字节数)。
for (int i = 0;i < WordDataLength;i++)

ByteArray[9 + I * 2]=高字节(MBHoldingRegister[Start + I]);
ByteArray[10 + I * 2]=低字节(MBHoldingRegister[Start + I]);

MessageLength = ByteDataLength + 9;
client.write (((const uint8_t *) ByteArray、MessageLength);

字节 FN = MB_FC_none;

中断;


案例 MB_FC_WRITE_register:// 06写入保持寄存器
MBHoldingRegister[Start]=字(ByteArray[MB_tcp_register_number]、ByteArray[MB_tcp_register_number+1]);
ByteArray[5]= 6;//此字段后面的字节数。
MessageLength = 12;
client.write (((const uint8_t *) ByteArray、MessageLength);
字节 FN = MB_FC_none;
中断;

案例 MB_FC_WRITE_MULTIPLE_REGISTERS"://16写入保持寄存器
ByteDataLength = WordDataLength * 2;
ByteArray[5]= ByteDataLength + 3;//此字段之后的字节数。
for (int i = 0;i < WordDataLength;i++)

MBHoldingRegister[Start + I]= word (ByteArray[ 13 + I * 2]、ByteArray[14 + I * 2]);

MessageLength = 12;
client.write (((const uint8_t *) ByteArray、MessageLength);
字节 FN = MB_FC_none;

中断;






  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kishan,

    这只是您当时与社区分享的一个示例吗? 如果是、谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kishan,

    我想这只是为了与社区分享、我们将关闭此主题、再次感谢。 顺便说一下、如果您还没有将此内容发布到 Energia 论坛、因为我们将所有 Energia 支持转至此处: forum.43oh.com/.../