【问题标题】:Reading Data From PLC With Defined Tags使用定义的标签从 PLC 读取数据
【发布时间】:2017-10-07 20:12:52
【问题描述】:

我需要使用预定义的标签从 PLC(Siemens S7300) 读取数据。我得到了这些数据的地址,但由于客户的要求,我不能使用他们的地址。我无法处理这个问题。我尝试了一些像(S7.NET)这样的库,但我做不到。

这是我的示例表

我尝试了一些编码,但都没有给我正确的结果。

如果我尝试

plc.Read("MD40")

为了读取第一行的价值,它给了我价值。 但正如我所说,我不能使用像 (MD40,DB100.DBX0 etc) 这样的值地址。我需要读取像

这样的值

plc.Read("SP_Bası_1")

.

或者如果我想读取第二行值,我必须使用 bool data = plc.Read("HMI_Start"); 之类的东西,而不是 bool data = plc.Read("MD20.0");

有人有什么建议吗?

【问题讨论】:

  • IEEE754 是浮点数,因为它是四个字节,所以它在 c# 中是一个单一的。读取数据的正确方法是放入一个 BinaryStream 类,一次读取一种类型。对我来说很简单,因为我是 EE 并且以前做过数百次。我怀疑您必须对这些设备进行编程,并且需要将编译器的输出转换为内存块。数据可能是有序的,因此使用 BinaryStream 首先读取一个(四个字节),然后是一个字节布尔值,然后是另一个字节布尔值。
  • @jdweng 感谢您的回答。我的问题不是数据类型。例如。如果我需要阅读第二行,我必须使用 bool data = plc.Read("HMI_Start");插入 plc.Read("MD20.0")。这清楚吗?英语不是我的母语,我无法解释我的问题
  • 然后将两个字符串放入类中,即 PLC 标签和地址。如果需要,可以有两个字典,一个通过 PLC 标签查找,另一个通过地址名称查找。
  • 但是访问数据地址几乎是一样的。在这个方法中,我首先定义地址,然后通过标签访问,我需要访问而不在 C# 代码中定义任何地址。我是 PLC 的新手,我不能直接访问 PLC 标签,而不在 C# 代码中定义任何地址吗? (在 PLC 内存中定义标签?)
  • 我认为您误解了客户的要求。在您的代码内部,您需要地址。客户只想按名称查找值。如果出于安全原因他不希望您在表中创建地址,那么您需要通过顺序遍历表来动态获取数据,直到您获得数据(慢得多)。

标签: c# .net plc


【解决方案1】:

解决您的问题的一种干净的方法,对我来说最好的方法是使用 OPC UA 服务器 ...

我相信最近的一些 S7 型号可能内置了 OPC UA 服务器

理论上也可以使用支持以太网/IP 协议的另一个 PLC 品牌,例如 Omron 或 AB,使用以太网/IP 可以通过名称而不是内存地址引用变量,但我认为此功能仅存在于高级 PLC 中。

无论如何,使用原始 S7 协议无法实现您想要做的事情

【讨论】:

    【解决方案2】:

    构建内存映射。将数据读入字节数组。然后您可以使用 BitConverter 使用地址转换数据(偏移到数组)。所以你需要使用下面的类创建一个字典。然后,您可以在字典中查找地址。要构建字典,请读取表格的一行以将一个条目添加到字典中。

        class Map
        {
            public static Dictionary<string, Map> dict = new Dictionary<string, Map>();
    
            string name { get; set; }
            long address { get; set; }
            Type _type { get; set; }
        }
    

    【讨论】:

    • 但是访问数据地址几乎是一样的。在这种方法中,我先定义地址,然后通过标签访问,我需要访问,而无需在 C# 代码中定义任何地址
    • @AhmetKarabulut 如果 OPC 不适合您,我认为这种方法并没有那么错误,也许是您能得到的最接近的方法。也许您可以在 S7 内部编写内存映射。另一个优点是您可以在那里解析地址。那么您必须在 C# 代码中定义的唯一地址就是该地图的地址。
    • 我认为 op 正在构建一个工具来修改 PLC 内部的 ram 块。由于不同的 PLC 将具有不同数量的柱塞块和不同的位置,因此客户不希望对柱塞块位置进行硬编码。然后每个 ram 块都会有变量,这些变量也必须是名称而不是地址。
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多