我对混合事件和线程知之甚少.场景是在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) 我正在使用 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]是变量句柄, …
在 TwinCAT 3 中使用功能块时,我看到可以使用 anaction代替 a 的选项method。我只熟悉方法。两者之间有什么区别,什么时候应该使用其中一种而不是另一种?
我想知道为什么TwinCAT中的FIFO数据结构使用动作而不是方法。
在TwinCAT 2.10和第一个基于CoDeSys 2.3的CoDeSys 2.3中,指针是否可以安全地防止在线更改PLC程序?如果内存块作为在线程序更改的一部分重新分配并且指针指向该内存块会发生什么?
我是 PLC 编程新手,在连接 Beckhoff 设备时遇到问题。我使用了 EL1008 设备,它有 8 个输入。在 Beckhoff 网站上,我找到了下表。当将变量分配给输入时,我很困惑,哪个变量映射到%IX0.0 %IX0.1 %IX0.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) 我尝试在本地 PC 上激活我的配置,但失败了。我试过:
\n\n\n\n\'TwinCAT System\' (10000): 发送 ams 命令 >> Init4\\RTime: 启动中断:Ticker 已启动 >> AdsWarning: 4118 (0x1016, RTIME: 隔离 CPU 启动失败!) << 失败!
\n
\n\n\n无法使用 KB4056894 将 TwinCAT 设置为运行模式
\n卸载KB4056894
\n或者
\n仅使用隔离核心激活解决方案
\n
我在我的电脑上找不到安装的 KB4056894。还有其他解决方案吗?
\n我在 Windows 10 下使用 TwinCAT 3 Build 4022.14。
\nenum当你在 a 中定义 an 时出现问题method。
我试图这样做:
VAR
enumA:(A,B,C);
END_VAR
Run Code Online (Sandbox Code Playgroud)
TwinCAT3 Shell 当我在(TcXaeShell)中使用它时,编译器会做出反应。

任何帮助,将不胜感激。
我有一个想要返回值的方法。该声明对我来说很清楚。但是如何在方法实现中分配要返回的值呢?
我只能想到创建一个输出变量并使用它来将值传播给调用者。但这绝对不是我期望返回值的工作方式:
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) 这是 TwinCAT3 中的最少代码
// declaration
fTest : REAL := 32700.0;
// implementation
fTest := fTest + 0.001;
Run Code Online (Sandbox Code Playgroud)
该代码会将 fTest 增加到 32768。该数字不会再增加。任何高于 32768 的当前 fTest 值都将阻止其增加。数量保持不变。而且,即使我改为0.001,0.0019它0.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)。