2016年11月30日 星期三

PLC SLMP Protocol的用法 (一)



在Receive loop的動作於一般TCP server的動作不同
一般server都會有ack的回應封包,所以可以判定資料封包是否有收完全

SLMP沒有這動作
PLC單純只會回應client端send的封包,資料封包丟完後無ACK的
簡單講也就是non-handshaking 的server啦

以下是code

private void OnReceive(System.IAsyncResult ar)
        {
            try
            {
                // Read data from the remote device.
                int bytesRead = tcpAsyn.EndReceive(ar);

                if (bytesRead > 0)
                {
                    // There might be more data, so store the data received so far.
                    asb.Append(Encoding.ASCII.GetString(tcpAsyClBuffer, 0, bytesRead));

                    // Get the rest of the data.
                    tcpAsyn.BeginReceive(tcpAsyClBuffer, 0,tcpAsyClBuffer.Length , 0,
                        new AsyncCallback(OnReceive), tcpAsyn);
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (asb.Length > 1)
                    {
                        response = asb.ToString();
                    }
                    //add do_packet
                    do_packet();
                    // Signal that all bytes have been received.
                    receiveDone.Set();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                //Console.ReadKey(true);
            }
        }

上面的一般tcp server的用法
這樣是無法正常運作的喔

1 則留言: