Imports System.Threading Imports ORPublicApiRefCore Imports ORSocketsCore Module Program Private api As OnRampAPI Private socketClient As ORSocketClient Private quitEvent As ManualResetEvent = New ManualResetEvent(False) Sub Main(args As String()) 'The http_root endpoint - use the MAIN webserver, not a farm 'Use ProdCopy for testing if needed Dim envUrl As String = "https://onramp.site.com/PROD" 'create a socket connection to OnRamp Server to get interrupts of shop monitor events 'You are registering as a "CLIENT APP NUMBER" - for this instance we will put SITE1001 'SITE1001 is the ID you set in S1280 - Device Shop Monitor for the SOCKETID on the event you wish to capture on this application. socketClient = New ORSocketClient(envUrl, "SHOPMONITORCLIENT", "SITE1001") 'This is how to bind incoming Interrupt socket messages to a subroutine - kind of like a RS232 Interrupt AddHandler socketClient.OnMessageReceived, AddressOf SocketMessageRec 'This is so we can debug websocket debugging info (for info purposes only, socket connected, reconnected etc) AddHandler socketClient.OnLog, AddressOf SocketLog 'Login to API to be able to query runQuery and Execute Queries in API Queries 'You can do lots of things with the API like OpenScreens, change values - everything you can do with a dataloader you can do with the API api = New OnRampAPI(envUrl) 'Make an OnRamp user to use to login with the api and login with those credentials api.APILogin("api_user", "api_password") 'now the App waits forever and interrupts to SocketMessageRec WaitForConsoleExit() End Sub Private Sub SocketMessageRec(obj As Object, e As ORSocketMessageReceivedArgs) 'This is the interrupt when the "shop monitor event happens" - it acts like RS232 sort of. Try 'You get msg details like who sent it and when Dim senderGroup = e.senderGroup Dim senderName = e.senderName Dim msgTime = e.msgTime Dim msg = e.msg 'you get a message array Dim msgSplit() As String msgSplit = Split(msg, Convert.ToChar(175)) 'msg = deviceid, channelNum, eventType Dim deviceId As String = msgSplit(0) Dim channelNum As Integer = V_N2I(msgSplit(1)) Dim eventType As ShopMonitorChannelEvent = V_N2I(msgSplit(2)) 'you can tie into event types Select Case eventType Case ShopMonitorChannelEvent.WorkOrderLogin 'new WO Logged in Case ShopMonitorChannelEvent.WorkOrderLogout 'WO Logged out Case ShopMonitorChannelEvent.CycleStart 'Cycle Start Case ShopMonitorChannelEvent.CycleDone 'Cycle Done End Select '^^With this information you can get all you want to know about the work order etc 'We create a query in S5011 - API Queries to get device_channel Work Order Info, then use other queries to get operation information etc 'The queries in this example are just for example, you need to create your own. 'arguments for server query Q-1234 Dim rsChannelArgs As New Dictionary(Of String, String) rsChannelArgs.Add("deviceid", deviceId) rsChannelArgs.Add("devicechannel", channelNum) 'Example Q-1234 query is 'SELECT devc_cur_wo FROM device_chan WHERE devc_device_id = '{{p:deviceid}}' AND devc_channel_num = '{{p:devicechannel}}' Dim rstDataWo = api.runQuery("Q-1234", rsChannelArgs) If rstDataWo.RecordCount > 0 Then Dim currentWoBarcode As String = rstDataWo("devc_cur_wo") 'get operation details Dim rsOperArgs As New Dictionary(Of String, String) rsOperArgs.Add("wobarcode", currentWoBarcode) 'Example Q-1235 'SELECT wom_partnum, wom_nbr, woo_oper FROM wo_oper INNER JOIN wo_mstr ON wom_nbr = woo_nbr where woo_barcode = '{{p:wobarcode}}' Dim rstDataOp = api.runQuery("Q-1235", rsOperArgs) If rstDataOp.RecordCount > 0 Then Dim woNum As String = rstDataOp("wom_nbr") Dim woOp As Integer = V_N2I(rstDataOp("woo_oper")) Dim woPart As Integer = V_N2I(rstDataOp("wom_partnum")) 'get all operations for the WO Dim allOpsArgs As New Dictionary(Of String, String) allOpsArgs.Add("wonum", woNum) 'Example Q-1236 'SELECT woo_oper, woo_qty_rep FROM wo_oper WHERE woo_nbr = '{{p:wonum}}' Dim rstDataAllOps = api.runQuery("Q-1236", allOpsArgs) If rstDataAllOps.RecordCount > 0 Then Do Until rstDataAllOps.EOF Console.WriteLine(rstDataAllOps("woo_oper") + " - QtyRep:" & rstDataAllOps("woo_qty_rep")) rstDataAllOps.MoveNext() Loop End If 'if we want to run an execute query Dim argUpdate As New Dictionary(Of String, String) argUpdate("deviceid") = deviceId argUpdate("part") = woPart 'Example Q-1237 'UPDATE tbl_param_det SET PN = '{{p:part}}' WHERE Device = '{{p:deviceid}}' api.runQuery("Q-1237", argUpdate) End If End If Catch ex As Exception Dim err As String = ex.Message End Try End Sub Private Sub SocketLog(obj As Object, msg As String) Console.WriteLine(msg) End Sub Private Sub WaitForConsoleExit() 'console app wait forevery on main thread Console.WriteLine("Running. Press Ctrl+C to exit.") AddHandler Console.CancelKeyPress, AddressOf ConsoleCancel 'Block here until Ctrl+C quitEvent.WaitOne() Console.WriteLine("Shutting down...") Try socketClient?.Dispose() Catch End Try End Sub Private Sub ConsoleCancel(sender, eArgs) quitEvent.[Set]() eArgs.Cancel = True End Sub End Module