登录
首页 串口通信 串口通信
回帖 发帖
正文

主题:威纶触摸屏编写发送modbus协议程序

点击:5365 回复:16

对  自有协议,但你需要要编写发送和接受指令,里面用到了crc校验程序,不是很会编写
16-10-02 11:03
有事例没编程
16-10-02 11:04
用触摸屏通过驱动器控制电机正反转
16-10-02 11:05

引用 18362893419 在 2016/10/2 11:05:05 发言【内容省略】

你的问题还没有解决吗?!
16-10-12 18:26
我做过威纶和STM32单片机通信,威纶PLC直接选择MODBUS RTU就可以了。
16-10-20 20:05
crc指令宏指令那里可以直接调用的  不麻烦  话说都这么久了应该已经解决了吧~~~
16-10-29 11:19
//串口初始化9600,8,N,1
void uart_init(u32 pclk2,u32 bound)
{  
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);
mantissa=temp;
fraction=(temp-mantissa)*16;
   mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<14;
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;
RCC->APB2RSTR|=1<<14;
RCC->APB2RSTR&=~(1<<14);  
USART1->BRR=mantissa;
USART1->CR1|=0X200C;
USART1->CR1|=1<<8;
USART1->CR1|=1<<5;      
MY_NVIC_Init(3,3,USART1_IRQn,2);
}
void init_time3(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;
TIM3->ARR=arr;  //éè?¨??êy?÷×??ˉ??×°?μ//??o?1ms
TIM3->PSC=psc;  //?¤·??μ?÷72,μ?μ?1Mhzμ???êyê±?ó
 TIM3->CR1|=1<<4;    //?ò????êy
TIM3->DIER|=1<<0;  
TIM3->DIER|=1<<6;
MY_NVIC_Init(1,3,TIM3_IRQn,2);//?à??1£?×óó??è??3£?×é2
}
void beginSend(u8* sendPosi,u8 sendCount)
{
//IO1CLR=q2;
TX_EN; //éè?a·¢?í
while(sendCount>0)
{
sendCount--;
USART1_TX(*(sendPosi++));
}
RX_EN;
receCount=0;
}
void readRegisters(void )
{
u8 sendCount;
u16 tempAddr;
u16 crcData;
u16 byteCount;
u8 i;
tempAddr=(receBuf[2]<<8|receBuf[3])*2;
byteCount=(receBuf[4]<<8|receBuf[5])* 2;
sendBuf[0] = localAddr;
sendBuf[1] = 3;
sendBuf[2] = (u8)byteCount;
for(i=0;i {
sendBuf[i+3] = syscanshu[tempAddr];  
}
byteCount += 3;
crcData = crc16(sendBuf,byteCount);
sendBuf[byteCount] = crcData >> 8;
byteCount++;
sendBuf[byteCount] = crcData & 0xff;
sendCount = byteCount + 1;
beginSend(sendBuf,sendCount);                                   //
}
void presetMultipleRegisters(void)
{
u8 sendCount;
u16 tempAddr;
u8 byteCount;
u16 crcData;
u8 i;
tempAddr = (receBuf[2]<<8|receBuf[3])*2;//ìáè???′??÷??êy
sendBuf[0] = localAddr;
sendBuf[1] = 16;
sendBuf[2] = receBuf[2];
sendBuf[3] = receBuf[3];
sendBuf[4] = receBuf[4];
sendBuf[5] = receBuf[5];
byteCount =  receBuf[6];
for(i=0;i {
syscanshu[tempAddr]=receBuf[i+7];
}
crcData = crc16(sendBuf,6);
sendBuf[6] = crcData >> 8;
sendBuf[7] = crcData & 0xff;
sendCount = 8;
beginSend(sendBuf,sendCount);
}
/*******************************************************
*  ??    3?£osetRegisterVal()
*  1|    ?ü£oéè??μ¥????′??÷
*  è??ú2?êy£o?T
*  3??ú2?êy£o?T
********************************************************/
void setRegisterVal(void)
{
u8 sendCount;
u16 tempAddr;
u16 crcData;
tempAddr = (receBuf[2]<<8|receBuf[3])*2;
syscanshu[tempAddr]=receBuf[4];
syscanshu[tempAddr+1]=receBuf[5];

sendBuf[0] = localAddr;
sendBuf[1] = 6;
sendBuf[2] = receBuf[2];
sendBuf[3] = receBuf[3];
sendBuf[4] = receBuf[4];
sendBuf[5] = receBuf[5];
crcData = crc16(sendBuf,6);
sendBuf[6] = crcData >> 8;
sendBuf[7] = crcData & 0xff;
sendCount = 8;
beginSend(sendBuf,sendCount);
}
/*******************************************************
*  ??    3?£ocheckComm0Modbus()
*  1|    ?ü£o?ì2a′??úêy?Y
*  è??ú2?êy£o?T
*  3??ú2?êy£o?T
********************************************************/
void checkComm0Modbus(void)
{
u16 crcData;
u16 tempData;
if(receBuf[0]==localAddr)
{
if(receBuf[1]==3||receBuf[1]==6)
{
crcData = crc16(receBuf,6);
 if(crcData == receBuf[7]+(receBuf[6]<<8))
 {//D£?é?yè·
  switch(receBuf[1])
  {
  case 3:LED3=0;readRegisters();break;//?áè?±£3???′??÷(ò????ò?à??)//?áè?±£3???′??÷(ò????ò?à??)
      case 6:LED3=1;setRegisterVal();break;//éè??μ¥????′??÷
}
 }
}
if(receBuf[1]==16)
{
tempData = (receBuf[4]<<8) + receBuf[5];
tempData = tempData * 2; //êy?Y??êy
tempData += 9;
if(receCount >= tempData)
{// IO1CLR=q2;
crcData = crc16(receBuf,tempData-2);
if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
{

presetMultipleRegisters();
}

}

 }

 }
}
20-07-16 19:38

上一页 上一页

工控新闻

更多新闻资讯