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






4.88/5 (12投票s)
轻松超越任何 OPC 组件,并使用用户友好的 .NET 类来连接 Fatek 和 Facon PLC 系列
- 下载 Fatek Labview 实现 - 263.95 KB
- 下载 FATEK_Communication_Protocol - 415.99 KB
- 下载 Modbus 地址映射 - 64.87 KB
引言
如果您厌倦了使用一些复杂的非实时 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)是正确回答的(见下图)。
3 基本定义
3-1 主站和从站
FATEK PLC 在与外围设备的通信中被定义为从站,而外围设备在与 FATEK PLC 通信时始终被定义为主站。所有外围设备在与 FATEK PLC 通信时发送消息,FATEK PLC 在接收到主站消息时进行响应。
3-2 FATEK PLC 的通信消息格式
FATEK PLC 通信格式包括命令(主站)和响应(从站)消息,共有 6 列数据。
- 起始码 (STX):ASCII 码中 STX 的十六进制码是 02H。命令和响应消息中的起始字符都是 STX。接收端可以通过 STX 确定数据的起始码。
- 从站站号:站号是十六进制两位数的值。PLC 通信帧中只有一个主站和 255 个从站。每个从站都有唯一的编号,范围从 1~FEH。(如果站号为 0,则表示主站可以将命令发送给所有从站)当主站希望将命令发送给一个或所有(站号 = 0)从站时,它根据站号分配。当从站向主站发送响应消息时,它将发送自己的站号。
- 命令码:命令码是两位十六进制系统数字。它是主站希望从站执行的动作。例如,读取或写入离散状态、强制设置、运行、停止……从站发送响应消息时,响应消息中也包含从主站接收到的命令码。
- 数据信息:数据信息包含 0(无数据)~500 个 ASCII 字符。此列中的数据用于分配读取或写入的地址或值。此数据信息的开头包含响应消息中的错误代码。在正常情况下(未发生错误),错误代码必须在开头为 0(30H),然后是响应消息中的响应状态或值。当发生错误时,它将是错误代码而不是 0(30H),并且不会跟随数据信息。
- 校验和:校验和检查前 1~4 列 ASCII 码的十六进制值,并使用“LRC”(纵向冗余校验)方法生成一个字节长度(两个十六进制值 00~FF)的校验和值。当接收到消息时,接收端将以相同的方式检查此消息。当两个校验值相同时,表示数据传输正确。如果两个校验值不同,则表示发生了一些错误。LRC 方法的计算是将所有 ASCII 码的十六进制值(8 位长度)相加,并忽略进位,以保持校验值在 8 位长度。
- 结束码 (ETX):ASCII 码中 ETX 码的十六进制码是 03H。命令或响应的 ETX 码都是 ETX。当接收端接收到 ETX 码时,表示数据传输终止并开始处理命令或数据。
注 2:发送和接收消息的格式相同。
注 3:某些命令中的数据列可能不存在,校验和将施加到前 1~3 列。
注 4:PLC 站号的默认值均为 1。站号不能在网络中修改;可以通过 FP-07C 或 Winproladder 进行更改或修改。
4-符号和命令说明
4-1 通信错误代码表
4-2 组件的分类和分配
PLC 通信的主要功能是读取和写入 PLC 组件内部的状态或值。可读写和地址分配的离散量和寄存器如下表所示
注 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 通信命令
注 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 是否可用。
如何使用
...
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)
...
- 将
fatek
类添加到您的项目中。 - 将
fatek
类导入到您的表单/模块/类中。 - 在您的表单/类/模块中创建变量,如下所示
... Private f_plc As Fatek.FatekPLC ...
- 初始化对象并开始通信
... f_plc = New Fatek.FatekPLC(New System.IO.Ports.SerialPort ("COM1", 115200, IO.Ports.Parity.Even, 7, IO.Ports.StopBits.One)) f_plc.Open() ...
- 用于检查 PLC 状态
... Dim f_error As Fatek_Error_Code Dim f_response As Fatek_PLC_GistStatus = f_plc.Read_GistStatus(f_error) ...
- 用于获取 PLC 详细状态
... 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) ...
- 用于将 PLC 设置为运行模式
... Dim e_code As Fatek_Error_Code = New Fatek_Error_Code e_code = f_plc.Set_Mode(Fatek_PLC_Mode.Run) ...
- 用于将 PLC 设置为停止模式
... Dim e_code As Fatek_Error_Code = New Fatek_Error_Code e_code = f_plc.Set_Mode(Fatek_PLC_Mode.Stopped) ...
- 设置内部继电器 (M00000)
... Dim f_err As Fatek_Error_Code = f_plc.Set_Discrete(Fatek_Discrete_Area.M, Fatek_DIO_Mode.Set, 0) ...
- 获取 DI (X0~X10) 的启用状态
- 获取 DO (Y0~Y7) 的启用状态
... 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) ...
- 读取计数器/计时器 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) ...
- 设置计数器/计时器 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) ...
- 测试回环
... 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 实现