连接 CODESYS V3 PLC 模拟器示例

本文将使用 CODESYS V3 TCP 插件连接 CODESYS V3 PLC 模拟器,实现读写 CODESYS V3 模拟设备的数据。

CODESYS V3 开发环境安装

CODESYS V3 开发环境安装程序,可以去 CODESYS 官网下载。本示例使用的版本是 CODESYS V3.5 SP12,不同的版本有一定的差异,但是整体操作类似。

新建工程

  • 点击菜单 文件->新建工程,选择 Standard project, 取名为 test
  • 设备选择 CODESYS Control Win v3 x64,PLC_PRG 选择 结构化文本(ST)
  • Applicaton 右键添加对象 DUT,新建结构体 Point,定义如下图。 point_def
  • 打开 PLC_PRG, 定义变量如下图。 params_def
  • Applicaton 右键添加对象 符号配置,然后点击 建立,选择需要导出的变量,如下图所示。 symbol_def
  • 点击 编译,然后点击菜单 编译->生成代码,然后在工程目录会生成了符号文件 test.Device.Application.xml,内容如下。

xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Symbolconfiguration xmlns="http://www.3s-software.com/schemas/Symbolconfiguration.xsd">
  3. <Header>
  4. <Version>3.5.11.0</Version>
  5. <SymbolConfigObject version="3.5.12.0" runtimeid="3.5.12.0" libversion="3.5.11.0" compiler="3.5.12.0" lmm="3.5.12.0" profile="CODESYS V3.5 SP12+" settings="SupportOPCUA, XmlIncludeComments, LayoutCalculator=OptimizedClientSideLayoutCalculator" />
  6. <ProjectInfo name="test" devicename="Device" appname="Application" />
  7. </Header>
  8. <TypeList>
  9. <TypeSimple name="T_BOOL" size="1" swapsize="0" typeclass="Bool" iecname="BOOL" />
  10. <TypeSimple name="T_BYTE" size="1" swapsize="1" typeclass="Byte" iecname="BYTE" />
  11. <TypeSimple name="T_DINT" size="4" swapsize="4" typeclass="DInt" iecname="DINT" />
  12. <TypeSimple name="T_DWORD" size="4" swapsize="4" typeclass="DWord" iecname="DWORD" />
  13. <TypeSimple name="T_INT" size="2" swapsize="2" typeclass="Int" iecname="INT" />
  14. <TypeSimple name="T_REAL" size="4" swapsize="4" typeclass="Real" iecname="REAL" />
  15. <TypeSimple name="T_SINT" size="1" swapsize="1" typeclass="SInt" iecname="SINT" />
  16. <TypeSimple name="T_STRING" size="81" swapsize="0" typeclass="String" iecname="STRING" />
  17. <TypeSimple name="T_UDINT" size="4" swapsize="4" typeclass="UDInt" iecname="UDINT" />
  18. <TypeSimple name="T_UINT" size="2" swapsize="2" typeclass="UInt" iecname="UINT" />
  19. <TypeSimple name="T_USINT" size="1" swapsize="1" typeclass="USInt" iecname="USINT" />
  20. <TypeArray name="T_ARRAY__0__10__0__10__0__10__OF_INT" size="2662" nativesize="2662" typeclass="Array" iecname="ARRAY [0..10, 0..10, 0..10] OF INT" basetype="T_INT">
  21. <ArrayDim minrange="0" maxrange="10" />
  22. <ArrayDim minrange="0" maxrange="10" />
  23. <ArrayDim minrange="0" maxrange="10" />
  24. </TypeArray>
  25. <TypeArray name="T_ARRAY__0__10__0__20__OF_DWORD" size="924" nativesize="924" typeclass="Array" iecname="ARRAY [0..10, 0..20] OF DWORD" basetype="T_DWORD">
  26. <ArrayDim minrange="0" maxrange="10" />
  27. <ArrayDim minrange="0" maxrange="20" />
  28. </TypeArray>
  29. <TypeArray name="T_ARRAY__0__10__OF_INT" size="22" nativesize="22" typeclass="Array" iecname="ARRAY [0..10] OF INT" basetype="T_INT">
  30. <ArrayDim minrange="0" maxrange="10" />
  31. </TypeArray>
  32. <TypeUserDef name="T_Point" size="89" nativesize="92" typeclass="Userdef" pouclass="STRUCTURE" iecname="Point">
  33. <UserDefElement iecname="X" type="T_INT" byteoffset="0" vartype="VAR" />
  34. <UserDefElement iecname="Y" type="T_REAL" byteoffset="4" vartype="VAR" />
  35. <UserDefElement iecname="Name" type="T_STRING" byteoffset="8" vartype="VAR" />
  36. </TypeUserDef>
  37. <TypeArray name="T_ARRAY__0__5__OF_Point" size="552" nativesize="552" typeclass="Array" iecname="ARRAY [0..5] OF Point" basetype="T_Point">
  38. <ArrayDim minrange="0" maxrange="5" />
  39. </TypeArray>
  40. </TypeList>
  41. <NodeList>
  42. <Node name="Application">
  43. <Node name="PLC_PRG">
  44. <Node name="counter" type="T_STRING" access="ReadWrite" />
  45. <Node name="d1arr" type="T_ARRAY__0__10__OF_INT" access="ReadWrite" />
  46. <Node name="d2arr" type="T_ARRAY__0__10__0__20__OF_DWORD" access="ReadWrite" />
  47. <Node name="d3arr" type="T_ARRAY__0__10__0__10__0__10__OF_INT" access="ReadWrite" />
  48. <Node name="ok" type="T_BOOL" access="ReadWrite" />
  49. <Node name="point" type="T_Point" access="ReadWrite" />
  50. <Node name="points" type="T_ARRAY__0__5__OF_Point" access="ReadWrite" />
  51. <Node name="pos" type="T_REAL" access="ReadWrite" />
  52. <Node name="v" type="T_BOOL" access="ReadWrite" />
  53. <Node name="v1" type="T_BYTE" access="ReadWrite" />
  54. <Node name="v10" type="T_STRING" access="ReadWrite" />
  55. <Node name="v2" type="T_SINT" access="ReadWrite" />
  56. <Node name="v3" type="T_USINT" access="ReadWrite" />
  57. <Node name="v4" type="T_INT" access="ReadWrite" />
  58. <Node name="v5" type="T_UINT" access="ReadWrite" />
  59. <Node name="v6" type="T_DWORD" access="ReadWrite" />
  60. <Node name="v7" type="T_DINT" access="ReadWrite" />
  61. <Node name="v8" type="T_UDINT" access="ReadWrite" />
  62. <Node name="v9" type="T_REAL" access="ReadWrite" />
  63. </Node>
  64. </Node>
  65. </NodeList>
  66. </Symbolconfiguration>

启动模拟器与下载程序

  • windows 菜单栏,直接运行 CODESYS Control Win v3 x64
  • 开发环境切换到 Device 配置页,敲击回车键,连接模拟器,第一次连接,会要求设置用户名和密码。
  • 使用设置的用户名和密码登录到模拟器设备并下载程序,下载之后运行。

Neuron 配置节点连接 CODESYS V3 模拟器

  • 南向设备 中 点击 添加设备,选择 CODESYS V3 TCP 插件来创建一个连接 CODESYS V3 模拟器的节点。
  • 创建好节点后,点击 设备配置 进入设备配置页面,根据实际情况配置节点信息,
    • 设备 IP 地址:设备的 IP 地址,即模拟器运行主机的 IP 地址
    • 设备端口:设备的端口,默认为 11740
    • 连接超时时间:默认为 3000
    • 用户名:设置的用户名
    • 密码:设置的密码
  • 在创建好的南向设备节点中,创建组,并在组下创建点位,点位地址根据导出的 XML 文件中的 NodeList 进行拼接。
  • 进入 Neuron 数据监控 选择对应设备与组,查看采集的数据点,如下图所示。

data