我正在尝试将一个循环编程到一个DDEPoke调用中,这个函数是由VBA支持的,称为OPC。这将使我能够从excel电子表格写入PLC (RSLogix 500)数据库。
这是代码:
Private Function Open_RsLinx()
On Error Resume Next
Open_RsLinx = DDEInitiate(RsLinx, C1)
If Err.Number <> 0 Then
MsgBox "Error Connecting to topic", vbExclamation, "Error"
OpenRSLinx = 0 'Return false if there was an error
End If
End Function
Sub CommandButton1_Click()
RsLinx = Open_RsLinx()
For i = 0 To 255
DDEPoke RsLinx, "N16:0", Cells(1 + i, 2)
Next i
DDETerminate RsLinx
End Sub
如果与OPC服务器建立了链接(在本例中是通过RSLinx),则此代码可以工作,并将向PLC写入数据。
问题是,我无法让部分DDEPoke RsLinx, "N16:0", Cells(1 + i, 2)
按顺序将数据从一个excel单元写入到PLC数据数组的一个元素。
我试着做DDEPoke RsLinx, "N16:i", Cells(1 + i, 2)
和DDEPoke RsLinx, "N16:0+i", Cells(1 + i, 2)
,但是两者都没有效果,程序根本没有写任何东西。
如何设置代码以使N16:0一直递增到N16:255,然后停止?
发布于 2015-11-24 10:52:44
将变量i
从字符串中断开。但是,要注意隐式类型转换,但取决于哪种类型转换(Str()或CStr()),您将得到一个前导空间。因此,转换数字Str(i)
,然后用Trim()
包装以确保没有额外的空格,并将结果连接回"N“字符串:
RsLinx = Open_RsLinx()
For i = 0 To 255
DDEPoke RsLinx, "N16:" & Trim(Str(i)), Cells(1 + i, 2)
Next i
i
在字符串中不能工作的原因是,在VBA中,一组引号中的任何内容都被认为是文字字符串。与其他一些语言不同(想到的是PHP),在这样的字符串中可以解析变量,VBA必须将变量连接在一起。请考虑以下几点:
Dim s As String
s = "world"
Debug.Print "Hello s!"
这会将Hello s!
的文字输出到即时窗口,因为s
不是作为变量,而是作为文字字符串的一部分。正确的方法是通过连接:
Dim s As String
s = "world"
Debug.Print "Hello " & s & "!"
这会将预期的Hello World!
输出到即时窗口,因为s
现在被视为变量,并被解析和连接。
如果不是这样,可能很难处理以下问题:
Dim i As Integer
For i = 0 to 9
Debug.Print "this" & i
Next i
这样你就可以:
th0s0
th1s1
th2s2
th3s3
th4s4
'etc
在很多情况下这会让事情变得很难处理。
尽管如此,还是有一些语言--尤其是PHP --在使用特定的引号集( ""
或''
--我不记得是哪一种)时,实际上在将变量嵌入字符串本身时会解析变量:
$i = 5;
echo "this is number $i";
VBA没有此特性。
希望能帮上忙..。
https://stackoverflow.com/questions/33902862
复制