The synchronous model can be simpler to design and implement in most cases, however, under adverse conditions such as communications timeouts, the application's user interface can be affected.
The asynchronous model can be more complex to design and implement, however, under adverse conditions such as communications timeouts, the application's user interface is not affected.
The code example shown below is based on our Modbus/TCP ActiveX Control.
' A timer is used to sequence through multiple sequential transactions. Private Sub Timer1_Timer() ' If Busy try again at next timer tick If ASMBTCP1.Busy = True Then Exit Sub Select Case ASMBTCP1.Tag Case 0: ' Idle Exit Sub Case 1: ' Set starting memory location for transaction ASMBTCP1.MemStart = "1" Case 2: ' Set starting memory location for transaction ASMBTCP1.MemStart = "201" End Select ' Start the transaction ASMBTCP1.AsyncRefresh End Sub ' Complete event fires when transaction has completed. At this point, transaction result should be checked and data processed if successful. Private Sub Asmbtcp1_Complete(ByVal Result As Integer) 'Test result If Result = 0 Then Select Case ASMBTCP1.Tag Case 1: ' Extract data Text1 = ASMBTCP1.DataWord(0) ASMBTCP1.Tag = 2 Case 2: ' Extract data Text2 = ASMBTCP1.DataWord(0) ASMBTCP1.Tag = 0 End Select 'ERROR Else Select Case ASMBTCP1.Tag Case 1: ' Implement error handler ASMBTCP1.Tag = 0 Case 2: ' Implement error handler ASMBTCP1.Tag = 0 End Select End If End Sub
' No timer is required to sequence through multiple sequential transactions. Private Sub ReadRegisters() ' Set starting memory location for transaction ASMBTCP1.MemStart = "1" ' Perform the transaction ASMBTCP1.SyncRefresh ' Test result If ASMBTCP1.Result = 0 Then ' Extract data Text1 = ASMBTCP1.DataWord(0) Else ' Implement error handler Endif DoEvents ' Set starting memory location for transaction ASMBTCP1.MemStart = "201" ' Perform the transaction ASMBTCP1.SyncRefresh ' Test result If ASMBTCP1.Result = 0 Then ' Extract data Text2 = ASMBTCP1.DataWord(0) Else ' Implement error handler Endif End Sub