boming 发表于 2017-12-18 02:01

EWORLD DIY——开源仿制三菱PLC(Fx2N)并且应用于工业现场

<div class='showpostmsg'> 本帖最后由 boming 于 2017-12-18 02:01 编辑

                                 仿制三菱PLC(Fx2N)并且应用到工业现场
背景
本人从事工业应用开发(PLC,HMI编程等等),一直想开发出一套自己的整套控制系统,先从仿制开始吧!从PLC——》HMI——》伺服——》网络应用等。电脑与PLC通信本来是不能开源,公司开发的产品用到(要低调使用),考滤到后期开发配套系统时可能用到,就开源了。通信用业余时间前前后后,断断续续一直到努力着开发。希望有共同爱好的朋友一起交流。正巧,借助参加EEworld这个DIY活动正式发布最新的PLC控制单元(FX2n仿制产品)并且应用于到工业场版。之前发布过一些测试版。期望中到RIGOLDS1102U 双通道数字示波器 用来测方式高速计数和高速输出功能是否达到要求(应用中暂时没使用高速功能),感谢各位捧场。


介绍                              
PLC程序使用三菱GX Developer Version 8。本来要上传上来,文件太大,自行到三菱官网下载。
实际应用例程


主控使用STM32F446,使用标准库(不喜欢HAL库,严重影响PLC扫描时间),很容易移植到别的主控上,开发时特别考虑了快速移植,开发环境IAR。
























































主要目录

doc      开发过程中所有的资料,备注等
STM32F4xxDSP_StdPeriph_Lib_v1.8.0    标准库(STM32下载)
USER   源代码
       MCU    和主控相关的代码
       McuConnectPlc   PLC核心代码与主控连接代码
       PLC          PLC核心代码(可以看出特别容易移植到别的主控)
Fx2N   IAR项目文件
其它的没什么用

命名EXTI_PA0IO外部中断,使用PA0引脚相关
NVIC优先级设置相关
RCC   系统时钟初始化相关
RTC实时时钟相关




源代码简单介绍

1.MCU启动后,2.进行main,3.接着初始化各个时钟,包括实时时钟(PLC使用到)。4.初始化定时中断,1MS中断一次,给PLC定时器、扫描时间等使用(本MCU使用系统节拍时间,可以用定时器替代)。5中断优先级初始化。6进入PLC核心代码。
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s)
       before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f4xx.c file.
   */   

      RCC_Config();//初始化系统时间到最大180M
         /* Enable the LSI OSC */
      RCC_LSICmd(ENABLE);//使能LIS时种,给实时时钟使用      
      /* Wait till LSI is ready */
      while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
      {}

      /* SysTick end of count event each 10ms */
      RCC_GetClocksFreq(&RCC_Clocks);//获取主时钟,给系统节拍使用
      SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);//系统节拍初始化
      NVIC_Configuration();//中断优先级初始化
      plc_main();
}

void plc_main(void)
{
//      uint32 ddddd;
      uint8 temp;
      RGB_LED_Init();
//      LED4(OFF);//绿灯,运行
//      LED5(OFF);//红灯,出错
//      LED6(OFF);//蓝灯,电池低

      PLC_PowerUpReset();

      DMA_Uart_Init();
      Programme_Serial_Init(0);
      rs232_Serial_Init(D8120);
/*
      tim1_pwm_init();
       tim1_pwm_start(0xffFf,515,0x7FFF);

      tim2_ch1_pb8_UD_init();
      tim2_ch2_pb9_R_init();
      tim3_etr_pd2_UD_Init();

      tim8_pwm_init();
      tim8_pwm_start(0xffFf,515,0x7FFF);

      tim2_ENC_Init();
      tim5_ENC_Init();
      GetCounter2();
               
       GetCounter5();
      GetDir2();
*/
      /* RTC Configuration */
      RTC_Configuration();
      
      
      while(1)
      {
/*
                PLC_RAM32(PLC_R_START_ADD+0x0cdc)=Get_tim2_ch1_pb8_UD_Counter(); //c255
                if(PLC_BIT_TEST(0x800)) //m0
                        tim2_ch1_pb8_UD_Counter_Clear();

                PLC_RAM32(PLC_R_START_ADD+0x0cd8)=Get_tim3_etr_pd2_UD_Counter();//c254
                if(PLC_BIT_TEST(0x801)) //m1
                        tim3_etr_pd2_UD_Counter_Clear();
                */
                PLC_PROG_RUN();
                if(PLC_1MS_BIT>70)
                {
                        wdt();
                        PLC_1MS_BIT=0;
                        Receive_Processing(&PLC_UART_BUFFER,&PLC_UART_RECEIVE_CNT,&PLC_UART_T_BUFFER,&PLC_UART_T_CNT);
                        DMASend();

                        Receive_Processing(&RS232_R_BUFFER,&RS232_RECEIVE_CNT,&RS232_T_BUFFER,&RS232_T_CNT);
                        RS232_SEND();         
                        
                        if(D8065)
                        {
//                              LED5(ON);//红灯,出错
                        }
                        else
                        {
//                              LED5(OFF);//红灯,出错
                        }
                        if(D8065==0 && PLC_BIT_TEST(M8037)==0)
                        {
                              if(PLC_RUN_BIT==0)
                              {
                                        PLC_RUN_BIT=1;
                              }      //开始运行测试
//                              LED4(ON);//绿灯,运行                              
                              if(PLC_BIT_TEST(M8015) || PLC_BIT_TEST(M8019) || PLC_BIT_TEST(M8018)==0)
                              {
                                        RCC_RTCCLKCmd(DISABLE);
                                        temp=2;
                              }
                              else
                              {
                                        if(temp==2)
                                        {
                                                RCC_RTCCLKCmd(ENABLE);
                                                temp=1;
                                                D_to_RTC();
                                        }
                                        else
                                                RTC_to_D();
                              }                              
                              
                              #ifndef debug
                              if(PLC_RUN_BIT==3)
                              {
                                        wdt_init(D8000);
                              }
                              #endif
                        }
                        else
                        {
                              wdt_clear();
//                              LED4(OFF);//绿灯,运行
                              if(PLC_RUN_BIT!=0)
                              {
                                        PLC_BIT_OFF(M8000);
                                        PLC_RUN_BIT=0;
                                        PLC_BIT_ON(M8037);
                              }
                        }
                }
                #ifndef debug
                PLC_RUN_BIT==3;
                #endif
      }
}
现在PLC执行时间和三菱的一样,有的指令还快很多。
代码需要高手优化,期等高手帮忙,现在使用的MCU有大牛拉小车感觉。

现场使用的时NUCLEO—446RE核心+拆机杂牌PLC扩展使用。

欢迎大家跟帖交流!!!

后期计划
重新设计原理图,出PCB打样,电源定制,需要大电容检测断电保存数据。外壳定制。(本人不熟悉这块)希望有爱好朋友开发这块







</div><script>                                var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                               
                                if(parseInt(discuz_uid)==0){
                                                                                        (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                }
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

naga568 发表于 2017-12-18 08:00

哇~謝謝大俠 大方分享。

fsyicheng 发表于 2017-12-18 08:59

不错,可以组织一下,把这个开源到底:)

云博汇 发表于 2017-12-18 09:24

谢谢分享

DPJ_PLC 发表于 2017-12-18 09:37


谢谢分享,干货

zuoxp 发表于 2017-12-19 23:00

高手!收藏起来了!

yonsight 发表于 2018-1-3 23:23

能不能做成小型的,usb供电,针对学习使用的。平时练练手,国内仿品太多,利润空间已经不大。

boming 发表于 2018-1-4 07:39

yonsight 发表于 2018-1-3 23:23
能不能做成小型的,usb供电,针对学习使用的。平时练练手,国内仿品太多,利润空间已经不大。

可以的,减少一些IO M T C点

dnsam 发表于 2018-1-8 13:22

高手!早年我也应用过不少牌子的PLC,三菱是用的最多的,硬件开发这块不懂

smilegc 发表于 2018-2-13 10:00



谢谢分享,干货

正隶电气 发表于 2018-4-8 18:06

大神,只在学校学过PLC,后来从事单片机开发,想问怎么个做法做到支持梯形图?难道是命令定义?模块封装,然后梯形图软件去调用吗?能不能简单明了的讲一下,谢谢啦

mcu8031 发表于 2019-3-11 10:42

最新看到楼主的无私分享,不知道最近有没有更新,本人愿意协助一起维护

riggs 发表于 2019-3-27 13:59

楼主厉害啦 愿意分享就更厉害了

riggs 发表于 2019-3-27 14:00

顺便问下GXworks2能用吗

eebetter 发表于 2019-6-16 07:53

<table cellpadding="0" cellspacing="0">
        <tbody>
                <tr>
                        <td>高手!收藏起来了!</td>
                </tr>
        </tbody>
</table>

jimslin 发表于 2019-7-9 14:39

<p>楼主,厉害了,为努力的人点赞</p>

explorer55 发表于 2019-7-20 16:18

<p>谢谢</p>

guo1gang12632 发表于 2019-11-20 14:28

无私的您 感谢

wanderer8885 发表于 2020-6-3 17:37

这个是干货啊,我看能不能下载。

wanderer8885 发表于 2020-6-3 17:44

感谢楼主无私分享。
页: [1] 2
查看完整版本: EWORLD DIY——开源仿制三菱PLC(Fx2N)并且应用于工业现场