【问题标题】:Write variables in PLC from EXCEL用EXCEL在PLC中写变量
【发布时间】:2015-12-03 10:45:50
【问题描述】:

我有一个用于 TCP / IP 的 ActiveX 通信驱动程序,它允许我从 Excel 文件读取和写入 PLC。我想在 Excel 中写入另外 5 个单元格的值 5 MW,我用循环尝试了它,我一次只在 5 个变量中写入一个值。现在我有一个“选择案例”,它对我不起作用。请帮忙。代码如下:

For tt = 1 To 5
        valor(1) = Val(Cells(1, 4).Value)
        valor(2) = Val(Cells(2, 4).Value)
        valor(3) = Val(Cells(3, 4).Value)
        valor(4) = Val(Cells(4, 4).Value)
        valor(5) = Val(Cells(5, 4).Value)

    Next tt

    Select Case valor(tt)
        Case valor(1)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor)
        Case valor(2)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor)
        Case valor(3)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor)
        Case valor(4)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor)
        Case valor(5)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor)
    End Select

行:

MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor)

是与PLC通讯的参数设置。最后一个参数是我们需要写入的值,我从一个单元格中收集到的。

代码是 Excel 2002 中的 VBA。

谢谢!!!

【问题讨论】:

  • 选择案例在 for/next 循环之外。因此,当您到达选择案例时, tt 的值将始终相同。令人惊讶的惊喜...... tt 在循环完成后将始终为 6。所以选择案例永远不会找到有效的结果。

标签: excel vba plc


【解决方案1】:

试试这个

For tt = 1 To 5
    valor(1) = Val(Cells(1, 4).Value)
    valor(2) = Val(Cells(2, 4).Value)
    valor(3) = Val(Cells(3, 4).Value)
    valor(4) = Val(Cells(4, 4).Value)
    valor(5) = Val(Cells(5, 4).Value)

    Select Case valor(tt)
    Case valor(1)
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor)
    Case valor(2)
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor)
    Case valor(3)
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor)
    Case valor(4)
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor)
    Case valor(5)
    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor)
    End Select
Next tt

【讨论】:

    【解决方案2】:

    正如 cboden 指出的那样,选择语句在 for 循环之外。而不是实现一个选择语句,你应该这样做(阅读这篇文章的其余部分以获得解释):

    For tt = 1 To 5
        valor = Val(Cells(tt, 4).Value)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor)
    Next tt
    

    解释:

    请记住,对于每个 tt (1,2,3,4,5) 值,for 循环将在循环内运行所有代码一次,这意味着:

    For tt = 1 To 5
        valor(1) = Val(Cells(1, 4).Value)
        valor(2) = Val(Cells(2, 4).Value)
        valor(3) = Val(Cells(3, 4).Value)
        valor(4) = Val(Cells(4, 4).Value)
        valor(5) = Val(Cells(5, 4).Value)
    Next tt
    

    可以(并且应该)这样写:

    For tt = 1 To 5
        valor(tt) = Val(Cells(tt, 4).Value)
    Next tt
    

    select 语句不仅是错误的,而且是不必要的。正确的版本(如果您选择将它放在 for 循环中,我不推荐这样做,因为它是多余的并且使代码更难阅读)是:

    Select Case tt
        Case 1
            res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 5, 1, 1000, 300, valor(1))
        Case 2
            res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 6, 1, 1000, 300, valor(2))
        Case 3
            res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 7, 1, 1000, 300, valor(3))
        Case 4
            res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 8, 1, 1000, 300, valor(4))
        Case 5
            res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 9, 1, 1000, 300, valor(5))
    End Select
    

    以上可以简写为:

    res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor(tt))

    对于 tt (1,2,3,4,5) 的每个值,如果与 valor(tt) = Val(Cells(tt, 4).Value) 一起放入 for 循环,将形成:

    For tt = 1 To 5
        valor(tt) = Val(Cells(tt, 4).Value)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor(tt))
    Next tt
    

    由于我们不需要保留 valor 数组,我们可以删除 valor(tt) 并用 valor 替换它,从而制作完成的代码:

    For tt = 1 To 5
        valor = Val(Cells(tt, 4).Value)
        res2 = MB1.Write("10.56.35.214", "10.56.35.22", 502, 0, 16, 4+tt, 1, 1000, 300, valor)
    Next tt
    

    我还建议您今后不要在此类公共论坛上发布 IP 地址。

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多