标签: twincat

C#Backgroundworker和Twincat,如何在工作线程中触发通知事件

我对混合事件和线程知之甚少.场景是在PC上运行C#程序,在PLC上运行Twincat.我们需要在C#程序中访问PLC变量(已经完成了没有后台工作线程并且工作正常.)现在我们需要将这些处理移动到一个线程(最好是后台工作者).这是不起作用的代码.(表单包含一个START按钮,它将启动BGworker,一个STOP按钮将取消BGWorker,以及一个UPDATE按钮,它将值从PLC更新到文本框.),但现在tcClient_OnNotification没有被召唤!请指出我错过的地方,任何帮助将非常感谢.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;


    using System.Threading;         // not added by default
    using System.IO;                // not added by default
    using TwinCAT.Ads;              // not added by default

    namespace BGworker
    {
        public partial class Form1 : Form
        {
            private BackgroundWorker bw = new BackgroundWorker();
            private TcAdsClient tcClient;   // C# program is the client.
            private AdsStream dataStream;   // Data transfered through System IOStream
            private BinaryReader binReader; // We are now reading …
Run Code Online (Sandbox Code Playgroud)

c# events backgroundworker twincat

4
推荐指数
2
解决办法
5167
查看次数

通过 C# 应用程序使用 TwinCAT.Ads 编写结构数组

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我正在用下面的代码编写,其中handles[0]是变量句柄, …

c# twincat twincat-ads twincat-ads-.net

4
推荐指数
1
解决办法
4037
查看次数

TwinCAT 3 中“操作”和“方法”有什么区别?

在 TwinCAT 3 中使用功能块时,我看到可以使用 anaction代替 a 的选项method。我只熟悉方法。两者之间有什么区别,什么时候应该使用其中一种而不是另一种?

我想知道为什么TwinCAT中的FIFO数据结构使用动作而不是方法。

plc structured-text twincat

3
推荐指数
1
解决办法
1326
查看次数

TwinCAT和CoDeSys的指针和在线更改

在TwinCAT 2.10和第一个基于CoDeSys 2.3的CoDeSys 2.3中,指针是否可以安全地防止在线更改PLC程序?如果内存块作为在线程序更改的一部分重新分配并且指针指向该内存块会发生什么?

pointers plc codesys twincat

2
推荐指数
1
解决办法
2118
查看次数

使用 Beckhoff 设备进行变量映射

我是 PLC 编程新手,在连接 Beckhoff 设备时遇到问题。我使用了 EL1008 设备,它有 8 个输入。在 Beckhoff 网站上,我找到了下表。当将变量分配给输入时,我很困惑,哪个变量映射到%IX0.0 %IX0.1 %IX0.3

在此输入图像描述

plc codesys twincat

2
推荐指数
1
解决办法
6156
查看次数

TwinCAT 3:写入文件

我想通过将一些数据写入文本文件并将其保存到 USB 记忆棒来从我的 PLC 导出一些数据。我设法创建了文本文件,但我什么也写不出来。

我在以下代码中使用了 TwinCAT 标准库中的函数:

PROGRAM P_WriteFile
VAR
    nStateP         :   INT :=  1;
    fbOpenFile      :   FB_FileOpen;    // open or create file
    fbWriteFile     :   FB_FilePuts;    // write to file
    fbCloseFile     :   FB_FileClose;   // Close file

    sPath           :   STRING  :=  '\Hard Disk2\foobar.txt';    // target path
    sAmsNetID       :   STRING  := '1.23.34.456.1.1';
    sOutput         :   STRING  :=  'foo';

    bDone           :   BOOL;
END_VAR

CASE nStateP OF
1:
// open/create file
    fbOpenFile(sNetId := sAmsNetID, sPathName := sPath, nMode := 2, bExecute := TRUE, tTimeout …
Run Code Online (Sandbox Code Playgroud)

plc twincat

2
推荐指数
1
解决办法
4390
查看次数

TwinCAT:在隔离内核上运行失败

我尝试在本地 PC 上激活我的配置,但失败了。我试过:

\n
    \n
  1. 隔离我的电脑上的 1 或 2 个核心(在系统 > 实时下并重新启动电脑)并在这些核心上运行 PLC 任务。当我这样做时,我收到以下错误:
  2. \n
\n
\n

\'TwinCAT System\' (10000): 发送 ams 命令 >> Init4\\RTime: 启动中断:Ticker 已启动 >> AdsWarning: 4118 (0x1016, RTIME: 隔离 CPU 启动失败!) << 失败!

\n
\n

AdsWarning:4118(0x1016,RTIME:隔离 CPU 启动失败!)

\n
    \n
  1. 然后我尝试在普通的 Windows 专用 CPU 上运行它(因此没有一个 CPU\xe2\x80\x99s 被隔离)。当我激活配置(并在 BIOS 中启用虚拟化)时,我收到以下错误消息:
  2. \n
\n
\n

无法使用 KB4056894 将 TwinCAT 设置为运行模式

\n

卸载KB4056894

\n

或者

\n

仅使用隔离核心激活解决方案

\n
\n

无法使用 KB4056894 将 TwinCAT 设置为运行模式

\n

我在我的电脑上找不到安装的 KB4056894。还有其他解决方案吗?

\n

我在 Windows 10 下使用 TwinCAT 3 Build 4022.14。

\n

plc twincat

2
推荐指数
1
解决办法
5246
查看次数

如何在方法中定义枚举器?

enum当你在 a 中定义 an 时出现问题method

我试图这样做:

VAR
    enumA:(A,B,C);
END_VAR
Run Code Online (Sandbox Code Playgroud)

TwinCAT3 Shell 当我在(TcXaeShell)中使用它时,编译器会做出反应。 在此输入图像描述

任何帮助,将不胜感激。

plc codesys st twincat

2
推荐指数
1
解决办法
496
查看次数

如何分配方法的返回值?

我有一个想要返回值的方法。该声明对我来说很清楚。但是如何在方法实现中分配要返回的值呢?

我只能想到创建一个输出变量并使用它来将值传播给调用者。但这绝对不是我期望返回值的工作方式:

METHOD M_MyMethod : BOOL
VAR_OUT
    bReturnVal : BOOL;
END_VAR
Run Code Online (Sandbox Code Playgroud)
// Do some method things here.
// Then assign the return value.
bReturnVal := bWhatever;
Run Code Online (Sandbox Code Playgroud)

plc st twincat

2
推荐指数
1
解决办法
446
查看次数

无法将 0.001 添加到 REAL 数字

这是 TwinCAT3 中的最少代码

// declaration
fTest : REAL := 32700.0;

// implementation
fTest := fTest + 0.001;
Run Code Online (Sandbox Code Playgroud)

该代码会将 fTest 增加到 32768。该数字不会再增加。任何高于 32768 的当前 fTest 值都将阻止其增加。数量保持不变。而且,即使我改为0.0010.00190.0011仍然不会增加。然而,当我写0.002.

范围REAL-3.402823e+38到产生3.402823e+38。但有一些与 32768 有关的东西。如何在 32768 以上的 fTest 中正确添加 0.001 或更低的值?这可能是 TwinCAT 中的一个错误吗?

更新:

有关 TwinCAT 中 REAL 的更多信息

根据 IEC 61131 3 / IEC 559 / IEEE754,32 位数据类型 REAL 的结构为 1 位符号、8 位以 2 为基数的指数(带符号)(-126...+127)、23 位尾数 (0 ...8,388,607)。

floating-point plc twincat

2
推荐指数
1
解决办法
289
查看次数