我使用Excel与一个使用HTTP协议的工业运动控制器进行通信。这就是我正在做的事情&它运行得很好。
ColumnCountA = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
a3 = 1
For a1 = 0 To ColumnCountA - 1
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://127.0.0.1/kas//plcvariables"
objHTTP.Open "PUT", URL, False
a2 = CStr(a1)
a4 = CStr(a3)
strDATA1Array = "Sample1Array[" + a2 + "]=" + LTrim((Application.ActiveSheet.Range("a" + a4).Value))
strDATA2Array = "Sample2Array[" + a2 + "]=" + LTrim(Str(Application.ActiveSheet.Range("b" + a4).Value))
strSendToKAS = strDATA1Array + "," + strDATA2Array + ","
objHTTP.send (strSendToKAS)
a3 = a3 + 1
Next使用上面的代码,我能够以数组的形式(strData1Array,strData2Array)将A&B列的所有内容发送到运动控制器。
我有下面的问题- 1。我想让用户知道这个数据传输已经完成(细胞数通常可以达到5000。因此,完成实际的数据传输需要8-10秒。我们有任何‘数据传输完成’确认位在excel端吗? 2。我计划使用一个按钮“清除数据在运动控制器”。按下此按钮后,我希望以前发送的所有HTTP数据都被重新设置为0。怎么做?我试着在A&B列中按0,但我的excel程序挂起。有什么建议吗?
发布于 2015-07-29 03:48:02
几件事:您的代码正在为每个循环中的objHTTP创建一个新的对象。这似乎是一种潜在的资源浪费。我会把这句话移出循环。另外,下一行不使用循环中的任何变量,因此在循环中使用它似乎也没有任何意义。
Open行确实需要在循环中,根据IServerXMLHTTP的文档,Send方法每次都需要一个Open和Send。既然如此,我会让他们更紧密地联系在一起,这样你所做的事情就更明显了。
至于检查命令是否已经完成,您可以检查ReadyState属性。
我不能完全理解删除之前的HTTP命令是什么意思,但我认为您是说要从excel工作簿中删除它们。您可以使用ClearContents来完成这一任务。
ColumnCountA = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
a3 = 1
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://127.0.0.1/kas//plcvariables"
For a1 = 0 To ColumnCountA - 1
a2 = CStr(a1)
a4 = CStr(a3)
strDATA1Array = "Sample1Array[" + a2 + "]=" + LTrim((Application.ActiveSheet.Range("a" + a4).Value))
strDATA2Array = "Sample2Array[" + a2 + "]=" + LTrim(Str(Application.ActiveSheet.Range("b" + a4).Value))
strSendToKAS = strDATA1Array + "," + strDATA2Array + ","
objHTTP.Open "PUT", URL, False
objHTTP.send (strSendToKAS)
'Check if the data transfer is complete
Do While objHTTP.ReadyState <> 4
Do Events
Loop
'Do something to inform the user the data transfer has completed
MsgBox("The HTTP data transfer has completed")
a3 = a3 + 1
Next
ColumnCountA.ClearContentshttps://stackoverflow.com/questions/31690414
复制相似问题