迪文科技论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 13460332002

【提问】关于K600+的通讯问题

[复制链接]

30

主题

46

回帖

437

积分

中级会员

Rank: 3Rank: 3

积分
437
 楼主| 发表于 2021-8-26 21:50:02 | 显示全部楼层
Lreamy 发表于 2021-8-26 08:46
可以写22文件,比如在变量地址0x0060的地方写入AA 00 02 21 BB,那就在按压状态同步数据返回第一次按压, ...

楼上这种方法只能用这种吗,如5A A5 06 83 0001 01 0001出AA 00 02 01 BB         5A A5 06 83 0001 01 0002出AA 00 03 01 BB,现在功能要求是变量图标,增量调节按钮,测试5A A5 AA 00 02 01 BB 通讯也没问题,难道非要用MODBUS???,但是MODBUS有校码,通讯不成功。或者谁能帮改下单片机程序,急!!!!
#include<reg52.h>                 //库文件
#include <intrins.H>
#include<EEPROM.h>
#define uchar unsigned char//宏定义无符号字符型
/********************************************************************
              24路输出IO口定义
*********************************************************************/
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;

sbit K9=P2^0;
sbit K10=P2^1;
sbit K11=P2^2;
sbit K12=P2^3;
sbit K13=P2^4;
sbit K14=P2^5;
sbit K15=P2^6;
sbit K16=P2^7;

/********************************************************************
              变量定义区
*********************************************************************/
uchar dat;
uchar t,r,ii;
uchar add;    //掉电保持485的地址
uchar j=0;
bit flag_zx=0;
uchar sendBuf[10];          //发送缓冲区
uchar receBuf[10];    //接收缓冲区
bit busy;
bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;
bit bz6=0;
bit bz7=0;
bit bz8=0;
/********************************************************************
                            延时函数
*********************************************************************
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}

/********************************************************************
              功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES=1;
EA=1;
}

/****************发送函数*********************/
void senduart2()
{          
SBUF=sendBuf[0];while(!TI);TI=0;
SBUF=sendBuf[1];while(!TI);TI=0;
SBUF=sendBuf[2];while(!TI);TI=0;
SBUF=sendBuf[3];while(!TI);TI=0;
SBUF=sendBuf[4];while(!TI);TI=0;
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
    uchar i;
        for(i=0;i<5;i++)
        {
            receBuf=0;
        }
}
/********************************************************************
                            主函数
*********************************************************************/
void main()
{
Init_Com();//串口初始化
add = EEPROMReadByte(0);
//add = 0X00;  //强制设置地址
    P2=0XFF;
        P1=0XFF;
while(1)
{

/********************************************************************
                            接收数据判断函数
*********************************************************************/
if(RI)  //如果有接收
           {
             RI=0; //接收标志清零
             receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
                 if(receBuf[0]!=0xaa){r=0;}
                 if(r>=5)
                 {        r=0;

                    flag_zx=1;
                 }
           }
           if(flag_zx==1)
           {                     

                flag_zx=0;
                    //0         1       2       3        4               
                        //起始位   地址位  功能位   数据位  结束位
                        if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果开始位和结束位,还有地址都正确,进行下一步判断
                        {
                           if(receBuf[2]==0x01)  //修改板子地址
                           {
                                add=receBuf[3];
                                            EEPROMSectorErase(0);//擦除扇区
                                EEPROMWriteByte(0,add);//写入新的地址
                                        sendBuf[0]=0xaa;
                                        sendBuf[1]=add;
                                        sendBuf[2]=0x01;
                                  sendBuf[3]=add;
                                        sendBuf[4]=0xbb;
                                      senduart2();                                         
                           }
                           else if(receBuf[2]==0x02)  //打开单路继电器
                           {
                                       switch(receBuf[3])
                                        {
                                            case 0x01: K1=0; break;
                                                case 0x02: K2=0; break;
                                            case 0x03: K3=0; break;
                                                case 0x04: K4=0; break;
                                            case 0x05: K5=0; break;
                                                case 0x06: K6=0; break;
                                            case 0x07: K7=0; break;
                                                case 0x08: K8=0; break;
                                                case 0x09: K9=0; break;
                                                case 0x10: K10=0; break;
                                            case 0x11: K11=0; break;
                                                case 0x12: K12=0; break;
                                            case 0x13: K13=0; break;
                                                case 0x14: K14=0; break;
                                            case 0x15: K15=0; break;
                                                case 0x16: K16=0; break;

                                                default:break;
                                        }
                           }
                           else if(receBuf[2]==0x03)  //关闭单路继电器
                           {
                                       switch(receBuf[3])
                                        {
                                            case 0x01: K1=1; break;
                                                case 0x02: K2=1; break;
                                            case 0x03: K3=1; break;
                                                case 0x04: K4=1; break;
                                            case 0x05: K5=1; break;
                                                case 0x06: K6=1; break;
                                            case 0x07: K7=1; break;
                                                case 0x08: K8=1; break;
                                              case 0x09: K9=1; break;
                                                case 0x10: K10=1; break;
                                            case 0x11: K11=1; break;
                                                case 0x12: K12=1; break;
                                            case 0x13: K13=1; break;
                                                case 0x14: K14=1; break;
                                            case 0x15: K15=1; break;
                                                case 0x16: K16=1; break;

                                                default:break;
                                        }                       
                           }
                           else if(receBuf[2]==0x04)  //打开全部继电器
                           {
                                if(receBuf[3]==0xff)
                                {
                                            P2=0X00;
                                            P1=0X00;
                                                P0=0X00;  
                                        }  
                           }
                           else if(receBuf[2]==0x05)  //关闭全部继电器
                           {
                                if(receBuf[3]==0x00)
                                {
                                            P2=0XFF;
                                                P1=0XFF;
                                                P0=0XFF;
                                        }                       
                           }
                           else if(receBuf[2]==0x06)  //查询继电器
                           {
                                        sendBuf[0]=0xaa;
                                        sendBuf[1]=add;
                                        sendBuf[2]=0x07;
                                        sendBuf[4]=0xbb;       
                               switch(receBuf[3])
                                   {
                                       case 0x01: if(K1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x02: if(K2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x03: if(K3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x04: if(K4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x05: if(K5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x06: if(K6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x07: if(K7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x08: if(K8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x09: if(K9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x10: if(K10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x11: if(K11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x12: if(K12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x13: if(K13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x14: if(K14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                       case 0x15: if(K15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
                                           case 0x16: if(K16==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;

                                           default:break;
                                   }  
                                   senduart2();
                           }
                          
                        }
                        if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
                        {
                            add=0x00;
                                        EEPROMSectorErase(0);//擦除扇区
                            EEPROMWriteByte(0,0);//写入新的地址       
                                  sendBuf[0]=0xaa;
                                        sendBuf[1]=add;
                                        sendBuf[2]=0x00;
                                  sendBuf[3]=0x00;
                                        sendBuf[4]=0xbb;       
                                  senduart2();
                        }
                        clear_receBuf();
                }


/*if(write==1)
{
write=0;
                        KK1 = P0;
                        KK2 = P1;
                        KK3 = P2;
                        KK4 = P3;
                        EEPROMSectorErase(0);
                        EEPROMWriteByte(0,KK1);
                        EEPROMWriteByte(1,KK2);
                         EEPROMWriteByte(2,KK3);
                        EEPROMWriteByte(3,KK4);
}*/
}
}

/********************************************************************
                              结束
*********************************************************************/

回复

使用道具 举报

0

主题

655

回帖

7538

积分

论坛元老

Rank: 8Rank: 8

积分
7538
发表于 2021-8-27 09:06:47 | 显示全部楼层
13460332002 发表于 2021-8-26 21:50
楼上这种方法只能用这种吗,如5A A5 06 83 0001 01 0001出AA 00 02 01 BB         5A A5 06 83 0001 01 0 ...

modbus的16位CRC校验网上有很多源码;如果按压状态同步返回还是 不会使用,可以咨询企业QQ:4000189008
沧海横流,方显英雄本色。
回复

使用道具 举报

0

主题

2

回帖

17

积分

新手上路

Rank: 1

积分
17
发表于 2021-9-16 11:22:25 | 显示全部楼层
吃透了,太厉害了。我还在研究与西门子plc  modbus通讯,一头雾水中
回复

使用道具 举报

0

主题

655

回帖

7538

积分

论坛元老

Rank: 8Rank: 8

积分
7538
发表于 2021-9-16 14:59:15 | 显示全部楼层
准备中秋节 发表于 2021-9-16 11:22
吃透了,太厉害了。我还在研究与西门子plc  modbus通讯,一头雾水中

有什么问题都可以咨询企业QQ:4000189008
沧海横流,方显英雄本色。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-23 10:54 , Processed in 0.066987 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表