实现基于Codesys的PROFINET控制器

在树莓派上安装Codesys运行时

可以参考基于CODESYS打造树莓派工业控制器,将树莓派打造成基于CODESYS的软PLC。

  1. 将编程平台IDE和Raspberry Pi连接到一个网段中,如192.168.0.*网段;
  2. 在Codesys编程平台菜单栏中的工具->Update Raspberry Pi,则可以在看到Raspberry的属性页面;
  3. 在Raspberry的属性页面中正确输入Username、Password、IP Address,然后可以点击“Start”启动Codesys运行时
  4. 双击“Device”页面,在通信设置中点击“扫描网络”,一般可以查找到Raspberry Pi的IP,如果没有还可以直接通过Raspberry Pi的IP地址查找;
  5. 通过SSH可以在/opt/codesys/路径下找到codessyscontrol文件。

新建Codesys工程

  1. Codesys编程平台菜单中的文件,创建一个新的“standard project”,输入工程名称;
  2. 在随后标准项目的配置对话框中,选择设备Codesys Control for Raspberry Pi SL
  3. PLC编程语言选择ST;
  4. 在设备属性页中双击“Device”,在通信设置中点击“扫描网络”,一般可以查找到Raspberry Pi的IP,如果没有还可以直接通过Raspberry Pi的IP地址,如果一切正常,Gateway-1下的Device标记应变为绿色;
  5. Codesys编程平台菜单中的工具,选择“设备库”;
  6. 通过加载设备描述文件(*.xml)在设备库中安装一个PROFINET设备;
  7. 右击设备Device (Codesys Control for Raspberry Pi SL),添加一个Ethernet设备;
  8. 右击Ethernet,在添加设备对话框中Profinet IO master选项中添加一个PN-Controller控制器;
  9. 右击PN-Controller,在添加设备对话框中Profinet IO slave选项中添加一个PROFINET IO设备;
  10. 右击P_Net_multi_module_sample_App, 在添加设备对话框中添加一个IO模块DIO 8xLogicLevel
  11. 双击Ethernet打开以太网属性页面,在“通用”标签页中点击“Browser”,选择控制器的网络接口,然后设置控制器的IP地址、子网掩码和默认网关,一般来说可以直接按照网络接口显示的IP地址进行设置;
  12. 双击PN_controller节点,在“通用”标签页中限制默认从站IP参数,也就说需要分配给PROFINET主站下所有连接的PROFIENT从站的IP地址,范围从“第一个IP地址” 和 “最后一个IP地址”,在例中只有一个从站设备,故两个都输入192.168.0.50;
  13. 双击P_Net_multi_module_sample_App节点,在“General”标签页中设置站点名称、IP地址、减速比等参数,本例中输入192.168.0.50,使用默认的设备名称,在PNIO标签页中可以看到PROFINET IO设备的数据已经自动映射到PLC的输入或输出区。

工程信息

编写一段PLC应用程序

  1. 双击PLC logic -> Application -> PLC_PRG开始编辑PLC代码:
  • 变量定义

      PROGRAM PLC_PRG
      VAR
          in_pin_button_LED: BOOL;
          out_pin_LED: BOOL;
          in_pin_button_LED_previous: BOOL;
          flashing: BOOL := TRUE;
          oscillator_state: BOOL := FALSE;
          oscillator_cycles: UINT := 0;
      END_VAR
    
  • 代码逻辑

      oscillator_cycles := oscillator_cycles + 1;
      IF oscillator_cycles > 200 THEN
          oscillator_cycles := 0;
          oscillator_state := NOT oscillator_state;
      END_IF
    
      IF in_pin_button_LED = TRUE THEN
          IF in_pin_button_LED_previous = FALSE THEN
              flashing := NOT flashing;
          END_IF
          out_pin_LED := TRUE;
      ELSIF flashing = TRUE THEN
          out_pin_LED := oscillator_state;
      ELSE
          out_pin_LED := FALSE;
      END_IF
      in_pin_button_LED_previous := in_pin_button_LED;
    
  1. 双击DIO_8xLogicLevel节点,在Edit IO mapping标签页中,通道Input 8 bits对应的变量映射到变量定义中的in_pin_button_LED,而Output Bit 7对应的变量映射到变量定义中的 out_pin_LED
  2. 双击Application --> MainTask,将MainTask任务周期Cyclic设置为4ms;
  3. 双击Application --> Profinet_CommunicationTask,将任务周期Cyclic设置为10ms,优先级设为14;

PLC应用程序下载调试

  1. Codesys编程平台菜单中的编译,使用生成代码
  2. 使用Codesys编程平台菜单中联机,将PLC代码下载到树莓派的Codesys运行时中;
  3. 在Codesys编程平台菜单中的调试 --> 开始
  4. 在Codesys编程平台菜单中的“更新树莓派”来跟踪Codesys控制器的日志,单击系统信息按钮,然后查看运行时信息文本框。如果找不到IO设备会显示一条网络错误消息;
  5. IO控制器每隔5s发一次LLDP数据包,每隔15秒它将发送一个ARP数据包请求IO设备的IP地址,通过PN-DCP数据包请求名称为“RT-Labs-Dev”的IO设备,这些数据包可以通过Wireshark软件抓包进行验证。

posted on 2022-06-07 16:16  MichaelChen-99  阅读(1819)  评论(0编辑  收藏  举报

导航