65.9K
CodeProject 正在变化。 阅读更多。
Home

Fatek 和 Facon PLC 通信协议串行接口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (12投票s)

2011 年 7 月 19 日

CPOL

9分钟阅读

viewsIcon

139233

downloadIcon

17227

轻松超越任何 OPC 组件,并使用用户友好的 .NET 类来连接 Fatek 和 Facon PLC 系列

引言

如果您厌倦了使用一些复杂的非实时 COM/COM+ 组件(就像我一样;D),这些组件强迫您连接 Fatek PLC 系列,并且对一个易于理解、开源、真正的实时 .NET 对象感兴趣,那么您就选对了文章。

本文介绍了一种纯代码实现的协议,您可以轻松地将其添加到您的项目中,确保安全可靠的 RS232/485 PC-PLC 通信,并超越任何价格高昂的 OPC 服务器;(我上次搜索的 OPC 服务器大约要 350 美元)!!

注 1:无论您打算实现以太网、RS232/485 还是调制解调器,我将介绍的对象都适用于基本协议。有关 Modbus 实现和地址映射,您可以从文章中下载通用文档,或在 Fatek 网站(www.fatek.com)上搜索。

1 背景

OOP 编程和在实时硬件依赖中实现精确的实现是我在 DeltaDTB PID 控制器中做过一次的事情。

2 接线

建立精确通信的第一步是精确接线,对于我们考虑的项目,旧的流行 RS232(2-2, 3-3, 5-5)是正确回答的(见下图)。

FATEKandFACONCommProtocol/FatekWiring.JPG

3 基本定义

3-1 主站和从站

FATEK PLC 在与外围设备的通信中被定义为从站,而外围设备在与 FATEK PLC 通信时始终被定义为主站。所有外围设备在与 FATEK PLC 通信时发送消息,FATEK PLC 在接收到主站消息时进行响应。

FATEKandFACONCommProtocol/MasterSlave.JPG

3-2 FATEK PLC 的通信消息格式

FATEK PLC 通信格式包括命令(主站)和响应(从站)消息,共有 6 列数据。

FATEKandFACONCommProtocol/CommFormat.JPG

  1. 起始码 (STX):ASCII 码中 STX 的十六进制码是 02H。命令和响应消息中的起始字符都是 STX。接收端可以通过 STX 确定数据的起始码。
  2. 从站站号:站号是十六进制两位数的值。PLC 通信帧中只有一个主站和 255 个从站。每个从站都有唯一的编号,范围从 1~FEH。(如果站号为 0,则表示主站可以将命令发送给所有从站)当主站希望将命令发送给一个或所有(站号 = 0)从站时,它根据站号分配。当从站向主站发送响应消息时,它将发送自己的站号。
  3. 命令码:命令码是两位十六进制系统数字。它是主站希望从站执行的动作。例如,读取或写入离散状态、强制设置、运行、停止……从站发送响应消息时,响应消息中也包含从主站接收到的命令码。
  4. 数据信息:数据信息包含 0(无数据)~500 个 ASCII 字符。此列中的数据用于分配读取或写入的地址或值。此数据信息的开头包含响应消息中的错误代码。在正常情况下(未发生错误),错误代码必须在开头为 0(30H),然后是响应消息中的响应状态或值。当发生错误时,它将是错误代码而不是 0(30H),并且不会跟随数据信息。
  5. 校验和:校验和检查前 1~4 列 ASCII 码的十六进制值,并使用“LRC”(纵向冗余校验)方法生成一个字节长度(两个十六进制值 00~FF)的校验和值。当接收到消息时,接收端将以相同的方式检查此消息。当两个校验值相同时,表示数据传输正确。如果两个校验值不同,则表示发生了一些错误。LRC 方法的计算是将所有 ASCII 码的十六进制值(8 位长度)相加,并忽略进位,以保持校验值在 8 位长度。
  6. 结束码 (ETX):ASCII 码中 ETX 码的十六进制码是 03H。命令或响应的 ETX 码都是 ETX。当接收端接收到 ETX 码时,表示数据传输终止并开始处理命令或数据。

注 2:发送和接收消息的格式相同。

注 3:某些命令中的数据列可能不存在,校验和将施加到前 1~3 列。

注 4:PLC 站号的默认值均为 1。站号不能在网络中修改;可以通过 FP-07C 或 Winproladder 进行更改或修改。

4-符号和命令说明

4-1 通信错误代码表

FATEKandFACONCommProtocol/ErrorTable.JPG

4-2 组件的分类和分配

PLC 通信的主要功能是读取和写入 PLC 组件内部的状态或值。可读写和地址分配的离散量和寄存器如下表所示

FATEKandFACONCommProtocol/Symbols.JPG

注 5:离散状态(X、Y、M、S)可以将 16 或 32 个连续状态组合成 16 位或 32 位寄存器,例如上表中的 WX???? 或 DWX????,但 ???? 应该是 8 的倍数。

注 6:分配离散地址需要 5 个字符,分配 16 位寄存器地址需要 6 个字符,分配 32 位寄存器地址需要 7 个字符。

注 7:上表中组件的地址边界是 FACON PLC 的最大值。用户应注意每个 PLC 组件的有效地址和属性。(例如,X?Y 地址的边界是 0000~0255;S 的边界是 FBE-PLC 的 0000~0999)。如果超出有效地址的边界,PLC 将回复错误代码“A”(非法地址),并且不会执行该命令。

4-3 通信命令

FATEKandFACONCommProtocol/OperationDescription.JPG

注 8:离散状态消息由一个字符表示(1 表示 ON,0 表示 OFF),16 位寄存器的数据使用 4 个字符表示一个 WORD 的值(0000H~FFFFH)。

注 9:32 位寄存器的数据是 DW(两个连续的字),必须使用 8 个字符来表示其数据。如果组件是 32 位寄存器,则必须将该组件视为 2W。例如,在命令代码 46 和 47 中,它们可以处理 64 个 16 位组件,但只能处理 32 个 32 位组件。

注 10:在命令代码 48 和 49 中,消息长度是离散量和字的总和。它们不能超过 64W(命令 48)和 32W(命令 49)。当增加一个点时,其总字数将减少一个字。反之亦然。由于 32 位组件的消息长度使用 2 个字,因此当增加一个 32 位组件时,它将减少 2 个字或点。例如,命令 48 的消息长度为 1~64W。如果它读取 20 个“32 位组件”,其消息将占用 40 个字,剩余 24W 可用于离散量或 16 位寄存器。

注 11:连续离散量或寄存器的操作(读写)不只是一个组件,并且数量是连续的,因此在分配时您不需要分配它们的组件号。您只需指定起始号和组件数量 (N)。其操作对象只能是离散量或寄存器中的一种,不能随机操作。

注 12:随机操作对象可以读写多个离散量和寄存器。由于它们的数量不连续,因此您必须指定它们的数量并允许随机操作离散量和寄存器。

注 13:保存和加载操作将 PLC 的所有程序区域保存到磁盘或加载到 PLC。一次通信中最大数据传输量为 64 字,因此需要多次通信才能完成保存或加载。

5 软件

5-1 字段

  • byte_Time:表示每个字节从 PC 传输到 PLC 或反之所需的时间。
  • Is_alive:指示 PLC 是否可用,默认为“False”。
  • Is_open:指示通信端口是否已获取并打开,默认为“False”。
  • Link:私有串行通信对象,默认为“Null”。
  • Str_discrete_area:包含离散区域符号(“X”、“Y”等)的字符串数组。
  • Str_register_area:包含连续区域符号(“R”、“D”等)的字符串数组。
  • Unit_address :包含单元地址,默认为1

5-2 属性

  • Alive:私有属性,获取/设置 PLC 是否可用。
  • ByteTime:只读属性,表示一个字节从 PLC 传输到 PC 或反之所需的时间。
  • CommSetting:设置/获取链接属性。请注意,连接时禁止设置。
  • IsAlive:获取 PLC 是否存活。
  • IsOpen:获取链接(通信端口)是否打开。
  • Opened:私有属性,获取/设置通信端口是否打开。
  • UnitAddress:获取/设置 PLC 单元地址。

5-3 重要方法

  • Close:关闭通信端口并结束通信。
  • Error:根据输入的错误代码生成错误字符串。
  • GetChecksum_byte:从给定的字节数组创建校验和代码。
  • Getchecksum_str:从给定的字符串创建校验和代码。
  • Loopback:验证连接属性和线路的正确性,设置单元地址和 PLC 功能。
  • New:创建新实例。
  • Open:打开通信端口并准备开始通信。
  • Read_Continuous:返回连续的相应寄存器。
  • Read_DetailedStatus:返回 PLC 的详细状态。
  • Read_Discrete_EnableStatus:返回连续离散寄存器的启用/禁用状态。
  • Read_GistStatus:揭示 PLC 的要旨状态。
  • Set_Continuous:将数据写入特定的连续寄存器。
  • Set_Discrete:设置离散 DO/继电器。
  • Set_Mode:设置 PLC 工作模式。
  • Status:根据给定的响应结构揭示 PLC 状态。
  • Test:验证 PLC 是否可用。

如何使用

FATEKandFACONCommProtocol/Fatek-01.PNG

...
Dim f_err As Fatek_Error_Code = New Fatek_Error_Code
Dim en_arr As Boolean() = f_plc.Read_Discrete_EnabledStatus
			(Fatek_Discrete_Area.X, 11, 0, f_err)
...
  1. fatek 类添加到您的项目中。
  2. fatek 类导入到您的表单/模块/类中。
  3. 在您的表单/类/模块中创建变量,如下所示
    ...
    Private f_plc As Fatek.FatekPLC
    ...
  4. 初始化对象并开始通信
    ...
    f_plc = New Fatek.FatekPLC(New System.IO.Ports.SerialPort
    	("COM1", 115200, IO.Ports.Parity.Even, 7, IO.Ports.StopBits.One))
    f_plc.Open()
    ...
  5. 用于检查 PLC 状态

    FATEKandFACONCommProtocol/Fatek-00.PNG

    FATEKandFACONCommProtocol/Fatek-01.PNG

    ...
    Dim f_error As Fatek_Error_Code
    Dim f_response As Fatek_PLC_GistStatus = f_plc.Read_GistStatus(f_error)
    ...
  6. 用于获取 PLC 详细状态

    FATEKandFACONCommProtocol/Fatek-01.PNG

    ...
    Dim f_response As Fatek_PLC_DetailedStatus = New Fatek_PLC_DetailedStatus
    Dim f_error As Fatek_Error_Code = New Fatek_Error_Code
    f_response = f_plc.Read_DetailedStatus(f_error)
    ...
  7. 用于将 PLC 设置为运行模式

    FATEKandFACONCommProtocol/Fatek-01.PNG

    ...
    Dim e_code As Fatek_Error_Code = New Fatek_Error_Code
    e_code = f_plc.Set_Mode(Fatek_PLC_Mode.Run)
    ...
  8. 用于将 PLC 设置为停止模式

    FATEKandFACONCommProtocol/Fatek-01.PNG

    ...
    Dim e_code As Fatek_Error_Code = New Fatek_Error_Code
    e_code = f_plc.Set_Mode(Fatek_PLC_Mode.Stopped)
    ...
  9. 设置内部继电器 (M00000)
    ...
    Dim f_err As Fatek_Error_Code = 
    	f_plc.Set_Discrete(Fatek_Discrete_Area.M, Fatek_DIO_Mode.Set, 0)
    ...
  10. 获取 DI (X0~X10) 的启用状态
  11. 获取 DO (Y0~Y7) 的启用状态

    FATEKandFACONCommProtocol/Fatek-01.PNG

    ...
    Dim f_err As Fatek_Error_Code = New Fatek_Error_Code
    Dim en_arr As Boolean() = f_plc.Read_Discrete_Status(Fatek_Discrete_Area.Y, 8, 0, f_err)
    ...
  12. 读取计数器/计时器 0~10
    ...
    Dim f_err As Fatek_Error_Code = New Fatek_Error_Code
    Dim short_arr As Short() = f_plc.Read_Continuous
    		(Fatek_Register_Area.CTR, 11, 0, Fatek_Data_Type.Short, f_err)
    ...
  13. 设置计数器/计时器 5~15
    ...
    Dim f_err As Fatek_Error_Code = f_plc.Set_Continuous(New Short() 
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 5, Fatek_Register_Area.CTR)
    ...
  14. 测试回环
    ...
    Dim err_code As Fatek_Error_Code = New Fatek_Error_Code
    Dim bln As Boolean = f_plc.LoopBack(err_code)
    ...

致谢

我衷心感谢 Kamalaldin Farzaneh 教授,他不仅是我的经理,也是我的老师,他让我尝试、跌倒并再次站起来。

历史

  • 首次发布:2011 年 7 月 19 日星期二
  • 更新:2011 年 7 月 20 日星期三
  • 更新:2011 年 7 月 24 日星期日,添加了 Labview 7.0 实现
© . All rights reserved.