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

并如上所述声明Stations的数组变量。

而且它有效。我可以将结构写到 PLC 中并查看数组中的 "ID: 0""ID: 1""ID: 2" 等字符串

【讨论】:

感谢朱梦的回复。我在 PLC 中定义了那个数组变量,忘记在帖子中提到。 handles[0] 也指向正确的数组变量。正如我在帖子中提到的,代码正在正确读取值,但在写入时抛出错误。我觉得我在编组结构属性时遗漏了或做错了什么。请您尝试使用与我相同的结构定义。 我实际上尝试了您所拥有的结构定义,请参阅我的编辑。 我在您的帖子中没有看到任何更新。你能帮我识别一下吗? @VP 抱歉,有点慢 我保留了我在实际代码中的所有内容,只是删除了最后一个参数new int[] 5 ,它正在工作。我把最后一个参数误认为是数组的长度。该参数在写入固定字符串值时很有用,并且必须在写入操作期间提供它。感谢朱梦的帮助。

以上是关于TwinCAT2 应用事项的主要内容,如果未能解决你的问题,请参考以下文章

倍福TwinCAT2中CX(ARM)啥意思

twincat只能用倍福工控机吗

安装Twincat时报错,如图

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在程序中添加注释

TwinCAT 3的基本功能

如何在 TwinCAT3 中获取 unix 时间戳?