电子DIY小家 发表于 2024-4-8 09:25:57

PLC 实战, 让你的32G12K128变成FX3U教程(二)程序下载, PLC 实战

接上一章:让你的 32G12K128 变成FX3U教程(一)建立连接,
PLC 实战https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7340
这一张主要实现的功能如下,通过上位机可以下载程序到工控板。
attach://40692.mp4


一、过程分析
1.上位机发送:02 45 30 31 38 30 30 30 30 32 03 44 33
2.上位机发送:02 45 30 31 38 30 34 34 30 43 03 45 43

3.上位机发送:02 45 30 30 38 30 30 30 46 45 03 46 42
4.上位机发送:02 45 30 30 38 30 46 45 30 32 03 46 44
5.上位机发送:02 45 30 30 38 30 31 34 30 36 03 44 42

6.上位机发送:02 46 35 30 31 30 30 30 36 30 03 44 35

7.上位机发送:02 45 31 31 38 30 30 30 35 43 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 32 30 46 34 30 39 46 46 30 42 46 34 30 31 45

8.上位机发送:02 45 31 31 38 30 35 43 46 45 30 30 32 34 30 30 43 35 30 46 30 30 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 03 32 39

9.上位机发送:02 46 35 30 31 30 34 32 36 31 03 44 43
10.上位机发送:02 45 31 31 38 30 30 32 30 32 44 38 42 41 03 44 35
11.上位机发送:02 45 30 30 38 31 35 32 30 32 03 44 41
15.上位机发送:02 46 35 30 31 30 30 30 36 30 03 44 35
13.上位机发送:02 46 35 30 31 31 30 38 30 30 36 03 30 45
14.上位机发送:02 45 30 31 38 30 30 38 30 38 03 45 31
15.上位机发送:02 30 30 45 43 41 30 32 03 38 45
16.上位机发送:02 45 37 37 36 36 30 03 35 32
17.上位机发送:02 46 37 31 38 30 35 43 31 46 44 35 43 30 46 46 03 38 30
18.上位机发送:02 46 35 30 31 30 36 39 36 30 03 45 34

19.上位机发送:02 45 31 31 38 30 35 43 46 45 30 30 32 34 30 30 43 35 30 46 30 30 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 03 32 39

20.上位机发送:02 45 38 37 36 36 30 03 35 33
21.上位机发送:02 30 30 45 43 41 30 32 03 38 45
22.上位机发送:02 42 03 34 35

乍一看好像上面的指令超级多,但是归类之下就很简单,首先每个数据帧是02开头,03结尾,命令就可以理解为如下的格式


需要注意的是不同的功能码的数据帧可能对应不一样的帧命令长度和数据,这一章节的内容的整个通信功能基本如下:


针对于上面的几种功能和每种功能对应的命令,分别编写对应的操作函数即可。

二、过程分析

1.针对0x45功能,01命令的回复
这一个命令主要是读取代码的属性,包含代码步长等信息,直接从内存区域读出来返回即可,实现的代码如下:
void PC_READ_PORG2(void)                  //读程序E01
{
      u16 temp;
      u8 temp_sum;

      comm_port.g_TxBuf=0x02;               //报文开始
      temp_sum=0;
      data_address-=0x8000;                   //发送下来的是80xx 对应到实际本地的偏移地址上
      for(temp=0; temp<data_size2; temp++)
      {
                comm_port.g_TxBuf =Ascll/0x10]; //取字节高位
                comm_port.g_TxBuf =Ascll%0x10]; //取字节低位
                temp_sum +=comm_port.g_TxBuf+comm_port.g_TxBuf;
      }
      comm_port.g_TxBuf=0x03;
      temp_sum+=0x03;
      comm_port.g_TxBuf=Ascll;
      comm_port.g_TxBuf=Ascll;
      comm_port.txCnt =temp*2+4;
   
}
数据回复的帧也和发送的帧一样02开头,03和两字节的校验结尾


需要注意的是发送和接收的数据都是ascll传输的,例如一个16进制的0x16,传输就是0x31 ,0x36,这个具体参照ascll码表即可。


2.针对0x45功能,00命令的回复
void PC_READ_Parameter2(void)      //读配置 E00
{
      
      u8 temp_sum;
      
      
      comm_port.g_TxBuf=0x02;//报文开始
      temp_sum=0;

      prog_address =PLC_Comm_Byte(comm_port.g_TxBuf*0x100+comm_port.g_TxBuf);//计算数据操作起始地址
      
    if((prog_address==0x1790)||(prog_address==0x17D0))//请求读监控数据区0X1790 与 0X17D0地址
      {
   
      }
    else
    {
      for(temp=0; temp<data_size2; temp++)      //读RAM
      {
            send=PLC_RW_RAM_8BIT(prog_address+temp);
            comm_port.g_TxBuf=Ascll; //取字节高位
            comm_port.g_TxBuf=Ascll; //取字节低位
            temp_sum +=comm_port.g_TxBuf+comm_port.g_TxBuf;
      }
    }
   
      comm_port.g_TxBuf=0x03;    //
      temp_sum+=0x03;
      comm_port.g_TxBuf=Ascll;
      comm_port.g_TxBuf=Ascll;
      comm_port.txCnt =temp*2+4;
}针对于上面的一系列操作其实基本就是读取一个内部信息和程序区域的参数,按照地址和命令直接返回plc_programCodeBuf或者plc_16BitBuf的数据即可,如果遇到一些特殊的命令还没解析出来的,可以直接抓包抓出他的返回值在特殊处理一下即可(一般返回个0x06或者0x15就能解决一半以上的问题)。
这里需要特别注意的一个命令或者说最最重要的一个命令就是0x45功能里的11命令,梯形图的程序会在上位机里转化成16进制的数据,然后通过串口下载过来,但是这个数据最总要保存到工控板里,或者说保存到单片机里,接受到之后回复上位机一个06即表示程序下载完成,但是这一节内容里我直接回复了个06,具体的程序保存我们下下章节再来完整的赘述,这里暂不处理,可以看到代码里现在我是这么处理的
void PC_WRITE_PORG2(void)
{

      prog_address =comm_port.g_TxBuf*0x100 +comm_port.g_TxBuf;   //计算数据操作起始地址
   
    //下载的程序数据需要保存,这里暂不实现
    comm_port.g_TxBuf = 0x06;
    comm_port.txCnt =1;         

}

可以看到这一章节的代码下载程序,上位机下载程序已经可以识别到这一步了;虽然命令看着多,但是其实归类下来就那么几个而已


这一张的代码有需要的可以在群文件下载,手边有FX3U的也可以自己去抓包看看通信的数据是不是都符合这个格式,有问题的小伙伴可以帖子下面留言,下一章节主要讲下载程序怎么保存。

jwd 发表于 2024-4-8 09:35:03

我的沙发{:4_245:}

cnos 发表于 2024-4-8 10:07:31

这些通信协议都是民间总结出来的还是从三菱内部搞出来的 啊

soma 发表于 2024-4-8 13:01:22

使用类似crc校验码

zhengshiyong 发表于 2024-4-8 13:23:37

在哪里下载啊,找不到啊{:4_267:}

电子DIY小家 发表于 2024-4-8 13:45:52

zhengshiyong 发表于 2024-4-8 13:23
在哪里下载啊,找不到啊

q群文件下载,软件是po解的,不敢直接传论坛上{:5_284:}群号在我的头像边上

咫尺天涯 发表于 2024-4-8 14:11:25

可以,持续更新了

zhengshiyong 发表于 2024-4-8 16:09:10

电子DIY小家 发表于 2024-4-8 13:45
q群文件下载,软件是po解的,不敢直接传论坛上群号在我的头像边上

好的

zxcv1973 发表于 2024-4-8 16:33:37

cnos 发表于 2024-4-8 10:07
这些通信协议都是民间总结出来的还是从三菱内部搞出来的 啊

肯定是中国民间了,不但把三菱全系列的给总结出来了,还把西门子的S7-200和S7-300系列也给总结出来了

zxcv1973 发表于 2024-4-8 16:35:29

总结通讯协议还简单些,更难的指令编码系统都全给总结出来了
页: [1] 2 3 4 5 6
查看完整版本: PLC 实战, 让你的32G12K128变成FX3U教程(二)程序下载, PLC 实战