TwinCAT2 应用事项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TwinCAT2 应用事项相关的知识,希望对你有一定的参考价值。
参考技术A 1. TwinCAT2 中编写ST程序为避免出现变量名字不符的低级错误,可通过F2 Local选项里面查找;F2是非法有用的功能键;2. PLC中定义的输入输出变量声明形式: <输入变量名> AT%I* : <变量类型>; <输出变量名> AT%Q* : <变量类型>;
3. 编译生成的 ***.TPY 文件非常关键,包含了输入变量和输出变量,任务周期等信息,在将公开变量导入 SYSTEM MANAGER 软件中时需要使用到;使用方式为:打开 SYSTEM MANAGER 软件之后,右键 PLC-configuration 点击 Append PLC Project,选择 ***.TPY 文件;
4. BOOT自动启动设置需要3步
在 Online 菜单下 Creat Bootproject;
在 System Manager 左边的树形菜单栏中找到 SYSTEM-Configuration 后,在右边配
置窗口中找到 Boot Setting(Target)选项进行设置;
选择 System Manager 中 PLC-Configuration 的 Plc Setting(Target)选项卡,激活对应
Runtime 中的 Boot 启动项;
5. TcSystem.lib 库文件里的系统变量 SYSTEMTASKINFOTYPE ,包含了当前任务的名称,第一次上电标志位,任务周期,优先级,上次程序执行时间等信息;
SystemTaskInfoType 参数介绍:
.active:任务被激活时为 TRUE(上图中 TASK1 被激活,但是 TASK2 未被激活);
.taskName:该 TASK 任务名称;
.firstCycle:一次循环标志位,只在第一个扫描周期为 TRUE,其余为 FALSE,可用于参数
的初始化等;
.cycleTimeExceeded:任务周期超时标志位,执行时间超过任务周期时为 TRUE;
.cycleTime:任务周期,单位 100 纳秒;
.lastExecTime:上次程序执行时间,单位 100 纳秒;
.priority:任务优先级;
.cycleCount:扫描周期数
6. Global Search 的使用方法 (对于阅读别人的程序特别有用,知道变量都在哪里用过)
Global Search 功能可在”Project”-“Global Search”找到,或者使用快捷方式(Ctrl+Alt+S);
7. TcSystem.lib,这个库文件中包含了 ads 读写的功能块,其中AMSNETID 和 ADSPORT 都可以通过 plc-control 软件的 Online 菜单——choose run-time system中找到;
以上参考倍福学院 TwinCAT2 入门教程 https://tr.beckhoff.com.cn/
通过 C# 应用程序使用 TwinCAT.Ads 写入结构数组
【中文标题】通过 C# 应用程序使用 TwinCAT.Ads 写入结构数组【英文标题】:Write array of struct using TwinCAT.Ads through C# application 【发布时间】:2016-08-22 18:10:47 【问题描述】:我正在使用 TwinCAT.Ads (TwinCAT 3) 通过 c# 应用程序进行 Beckhoff plc 通信。应用程序正在读取和写入一些 PLC 变量。我收到一个错误:
“无法编组对象。参数名称:值”
在编写结构变量数组时。但是应用程序正在读取它而没有任何错误。 任何帮助将不胜感激。下面是我的代码示例。
Plc 中的结构
TYPE Station :
STRUCT
ClusterID : STRING[10];
Tech_Type : USINT;
Status : BOOL;
Reject : BOOL;
Rej_Detail : STRING[50];
Rej_Catagory : USINT;
END_STRUCT
END_TYPE
c#中的类
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public class Station
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string ClusterID;
public byte Tech_Type;
[MarshalAs(UnmanagedType.I1)]
public bool Status;
[MarshalAs(UnmanagedType.I1)]
public bool Reject;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 51)]
public string Rej_Detail;
public byte Rej_Catagory;
我正在编写下面的代码,其中 handles[0] 是变量句柄,stations 是长度为 5 的类数组。
adsClient.WriteAny(handles[0], stations, new int[] 5 );
【问题讨论】:
你能贴出 PLC 中工作站阵列的代码吗?还有PLC中变量的声明和C#代码中的句柄。 Pack = 0是废话,删掉吧。 【参考方案1】:我猜你错过了 PLC 中的对应部分。请确保在您的 PLC 中声明了一个工作站数组,例如:
// I have it in a global variable list named: STG_Variables
stat_array_Var : array [0..5] of Station;
这段 C# 代码对我有用:
TcAdsClient AdsComClient = new TcAdsClient();
AdsComClient.Connect(NetID_TwinCat, 851);
int handle_array = AdsComClient.CreateVariableHandle("STG_Variables.stat_array_Var");
// get some test stations:
Station station = new Station();
Station station2 = new Station();
Station station3 = new Station();
Station station4 = new Station();
Station station5 = new Station();
Station[] station_plural = new Station[] station, station2, station3, station4, station5 ;
// write some stuff to recognize that write test worked
for (int i = 0; i < station_plural.Length; i++)
station_plural[i].ClusterID = "ID: " + i.ToString();
// just use the normal WriteAny method without the new int[] 5 parameter!
// send it down to the plc
AdsComClient.WriteAny(handle_array, plural);
我不知道你的句柄handles[0]
指向哪里。编写 Station
的数组不应以 plc 中的单个结构结束。试试我的版本,请评论它是否适合你。
编辑:我在 C# 中使用了这个类定义:
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public class Station
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string ClusterID;
public byte Tech_Type;
[MarshalAs(UnmanagedType.I1)]
public bool Status;
[MarshalAs(UnmanagedType.I1)]
public bool Reject;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 51)]
public string Rej_Detail;
public byte Rej_Catagory;
并创建了DUT
并在 PLC 中使用此结构定义:
TYPE Station :
STRUCT
ClusterID : STRING[10];
Tech_Type : USINT;
Status : BOOL;
Reject : BOOL;
Rej_Detail : STRING[50];
Rej_Catagory : USINT;
END_STRUCT
END_TYPE
并如上所述声明Station
s的数组变量。
而且它有效。我可以将结构写到 PLC 中并查看数组中的 "ID: 0"
、"ID: 1"
、"ID: 2"
等字符串
【讨论】:
感谢朱梦的回复。我在 PLC 中定义了那个数组变量,忘记在帖子中提到。handles[0]
也指向正确的数组变量。正如我在帖子中提到的,代码正在正确读取值,但在写入时抛出错误。我觉得我在编组结构属性时遗漏了或做错了什么。请您尝试使用与我相同的结构定义。
我实际上尝试了您所拥有的结构定义,请参阅我的编辑。
我在您的帖子中没有看到任何更新。你能帮我识别一下吗?
@VP 抱歉,有点慢
我保留了我在实际代码中的所有内容,只是删除了最后一个参数new int[] 5
,它正在工作。我把最后一个参数误认为是数组的长度。该参数在写入固定字符串值时很有用,并且必须在写入操作期间提供它。感谢朱梦的帮助。以上是关于TwinCAT2 应用事项的主要内容,如果未能解决你的问题,请参考以下文章