⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbusslaver.c

📁 传一个我们项目中用到得Modbus程序
💻 C
字号:
#include "msp430x42x.h"
#include "Global.h"                   // 全局定义
#include "ModbusReg.h"                // 数据操作, 错误定义
#include "USART.h"                    // 串口硬件操作, 错误定义


unsigned char Reg_MasterAddress = 4;      // 主机地址
// 发送信息
unsigned char Sended_SlaverAddress;
unsigned char Sended_Function;
unsigned int  Sended_StartingAddress;
unsigned int  Sended_NoOfRegisters;

unsigned char  Flg_CommStatus;
  
// 发送 - 读单/多寄存器操作命令
void Modbus_Echo_Command0x03(void)
{
  unsigned char Receive_SlaverAddress;          // 接收到的从机地址
  unsigned char Receive_Function;               // 接收到的功能代码
  unsigned int  Receive_StartingAddress;        // 接收到的寄存器起始地址
  unsigned int  Receive_NoOfRegisters;          // 接收到的寄存器数据个数
  unsigned char Tmp_DataHi;
  unsigned char Tmp_DataLo;
  unsigned int  Tmp_RegisterData;
  unsigned char i;
  
  // 读取信息
  Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress);           // 获得从机地址
  Flg_CommStatus = USART_ReceiveByte(&Receive_Function);                // 功能代码
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_StartingAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;        // 有效数据字节数
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_NoOfRegisters = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;          // 有效数据字节数
  Queue_ClearRxQueue();               // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
  
  // 返回数据头
  USART_SendInit();
  USART_SendByte(Receive_SlaverAddress);        // Slave Address
  USART_SendByte(Receive_Function);             // Function
  USART_SendByte(Receive_NoOfRegisters*2);      // No.Of Datas
  for(i=0; i<Receive_NoOfRegisters; i++)
  {
    Flg_CommStatus = Modbus_RegsiterRead(Receive_StartingAddress + i, &Tmp_RegisterData);
    USART_SendByte(Tmp_RegisterData/256);       // No. of Registers Hi
    USART_SendByte(Tmp_RegisterData%256);       // No. of Registers Lo
  }
  USART_SendChech();                            // Error Check
}

// 发送 - 写单寄存器操作命令
void Modbus_Echo_Command0x06(void)
{
  unsigned char Receive_SlaverAddress;          // 接收到的从机地址
  unsigned char Receive_Function;               // 接收到的功能代码
  unsigned int  Receive_RegisterAddress;        // 接收到的寄存器地址
  unsigned int  Receive_RegisterValue;          // 接收到的寄存器数据
  unsigned char Tmp_DataHi;
  unsigned char Tmp_DataLo;
  
  // 读取信息
  Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress);           // 获得从机地址
  Flg_CommStatus = USART_ReceiveByte(&Receive_Function);                // 功能代码
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_RegisterAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;        // 有效数据字节数
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_RegisterValue = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;          // 有效数据字节数
  Queue_ClearRxQueue();               // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
  
  //Flg_CommStatus = Modbus_RegsiterWrite(Receive_RegisterAddress, Receive_RegisterValue);
  // 返回数据
  if (Flg_CommStatus == ERR_OK)
  {
    // 操作成功
    USART_SendInit();
    USART_SendByte(Receive_SlaverAddress);        // Slave Address
    USART_SendByte(Receive_Function);             // Function
    USART_SendByte(Receive_RegisterAddress/256);  // Register Address Hi
    USART_SendByte(Receive_RegisterAddress%256);  // Register Address Lo
    USART_SendByte(Receive_RegisterValue/256);    // Register Value Hi
    USART_SendByte(Receive_RegisterValue%256);    // Register Value Lo
    USART_SendChech();                            // Error Check
  }
  else
  {
    // 操作失败
    USART_SendInit();
    USART_SendByte(Receive_SlaverAddress);        // Slave Address
    USART_SendByte(Receive_Function|0x80);        // Error Function
    USART_SendByte(Flg_CommStatus);                   // Error No.
    USART_SendChech();                            // Error Check
  }
}

// 发送 - 写多寄存器操作命令
void Modbus_Echo_Command0x10(void)
{
  unsigned char Receive_SlaverAddress;          // 接收到的从机地址
  unsigned char Receive_Function;               // 接收到的功能代码
  unsigned int  Receive_StartingAddress;        // 接收到的寄存器起始地址
  unsigned int  Receive_NoOfRegisters;          // 接收到的寄存器数据个数
  unsigned char Receive_NoOfDatas;              // 有效字节数
  unsigned char Tmp_DataHi;
  unsigned char Tmp_DataLo;
  //unsigned int  Tmp_RegisterData;
  unsigned char i;
  
  // 读取信息
  Flg_CommStatus = USART_ReceiveByte(&Receive_SlaverAddress);           // 获得从机地址
  Flg_CommStatus = USART_ReceiveByte(&Receive_Function);                // 功能代码
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_StartingAddress = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;        // 有效数据字节数
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
  Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
  Receive_NoOfRegisters = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;          // 有效数据字节数
  Flg_CommStatus = USART_ReceiveByte(&Receive_NoOfDatas);    
  for(i=0; i<Receive_NoOfRegisters; i++)
  {
    // 读取受到的数据
    Flg_CommStatus = USART_ReceiveByte(&Tmp_DataHi);               
    Flg_CommStatus = USART_ReceiveByte(&Tmp_DataLo);               
   // Tmp_RegisterData = (unsigned int)Tmp_DataHi*256 + Tmp_DataLo;          // 有效数据字节数
    // 将受到的数据写入寄存器
   // Flg_CommStatus = Modbus_RegsiterWrite(Receive_StartingAddress + i, Tmp_RegisterData);
    if (Flg_CommStatus != ERR_OK) break;
  }
  Queue_ClearRxQueue();               // !!! 如果没有把队列里的数据都读取完的话, 必须清空 !!!
  
  // 返回数据
  if (Flg_CommStatus == ERR_OK)
  {
    // 操作成功
    USART_SendInit();
    USART_SendByte(Receive_SlaverAddress);        // Slave Address
    USART_SendByte(Receive_Function);             // Function
    USART_SendByte(Receive_StartingAddress/256);  // Starting Address Hi
    USART_SendByte(Receive_StartingAddress%256);  // Starting Address Lo
    USART_SendByte(Receive_NoOfRegisters/256);    // No. of Registers Hi
    USART_SendByte(Receive_NoOfRegisters%256);    // No. of Registers Lo
    USART_SendChech();                            // Error Check
  }
  else
  {
    // 操作失败
    USART_SendInit();
    USART_SendByte(Receive_SlaverAddress);        // Slave Address
    USART_SendByte(Receive_Function|0x80);        // Error Function
    USART_SendByte(Flg_CommStatus);                   // Error No.
    USART_SendChech();                            // Error Check
  }
}


// 发送 - 错误消息
void Modbus_Send_CommandError(void)
{
  
}

void Modbus_DelayNms(unsigned int Nms)
{
  unsigned int i;
  for(; Nms>0; Nms--)
  {
    for(i=0; i<260; i++) _NOP();  
  }
}

// 处理函数
_EXTERN void Modbus_Deal(void)
{
  unsigned char SlaverAddress;
  unsigned char Function;
  // 检查处理标志
  if (Flg_ReceiveData == FALSE) return;
  Flg_ReceiveData = FALSE;
  // 检查数据头2个字节
  Flg_CommStatus = USART_ReceiveInfo(&SlaverAddress, &Function);
  if (Reg_MasterAddress != SlaverAddress) return; // 地址检查
  // 帧间延迟, 4个字节间隔
  Modbus_DelayNms(88);
  // 数据处理
  switch(Function)
  {
    case 0x03: Modbus_Echo_Command0x03(); break;
    //case 0x06: Modbus_Echo_Command0x06(); break;
   //case 0x10: Modbus_Echo_Command0x10(); break;
    default:   break;//Modbus_Send_CommandError();// 错误Function
  }
}

// Modbus初始化函数
_EXTERN void Modbus_Init(void)
{
  // 读取设置, 初始化串口
  USART_Init();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -