Класс сокета Modbus TCP не получен от Moxa
Хорошо, вот мой код соединения TCP:
//sck.Bind(new IPEndPoint(0, 1234));
try
{
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(IP_AddressTXT.Text), Convert.ToInt16(IP_PortTXT.Text));
sck.Connect(localEndPoint);
//sck.h
}
catch( Exception e)
{
MessageBox.Show("Unable to connect to remote end point! ", e.Message);
return;
}
MessageBox.Show("Connected to : " + IP_AddressTXT.Text);
Enter1.Text = "connected..."; }
так что часть работает.. она соединяется...
вот мой код отправки:
public void Send( byte[] buffer, int offset, int size, int timeout)
{
int startTickCount = Environment.TickCount;
int sent = 0; // how many bytes is already sent
try
{
sent = sck.Send(buffer);
}
catch (SocketException ex)
{
MessageBox.Show("error", ex.Message); // any serious error //occurr
}
}
Я использовал WireShark, и он говорит, что я отправляю это:
0000 00 90 e8 30 f8 e0 34 e6 d7 15 0d d5 08 00 45 00 ...0..4.......E.
0010 00 30 3c a3 40 00 80 06 60 fa a9 fe 08 2d a9 fe .0<.@...`....-..
0020 01 01 fe 20 10 a4 a6 74 fa 75 17 c7 ca e0 50 18 ... ...t.u....P.
0030 40 29 17 9a 00 00 01 03 01 a6 00 01 65 d5 @)..........e.
01 03 a6 00 01 65 d5 - мое сообщение Modbus.
теперь я вижу ответ на Wireshark от Мокса это:
0000 34 e6 d7 15 0d d5 00 90 e8 30 f8 e0 08 00 45 00 4........0....E.
0010 00 28 16 ec 40 00 80 06 86 b9 a9 fe 01 01 a9 fe .(..@...........
0020 08 2d 10 a4 fe 85 09 13 68 d7 c4 1c 89 ee 50 10 .-......h.....P.
0030 83 24 00 66 00 00 00 00 00 00 00 00 .$.f........
но когда я иду читать это сообщение и когда я вызываю функцию Receive, программа просто сидит там и ничего не делает
вот моя функция чтения:
public void Receive(byte[] buffer, int offset, int size, int timeout)
{
int startTickCount = Environment.TickCount;
int received = 0; // how many bytes is already received
//sck.Listen(100);
try
{
received = sck.Receive(buffer);
}
catch (SocketException ex)
{
MessageBox.Show("error", ex.Message);
}
processingData(buffer);
}
Что я делаю неправильно? почему он просто сидит на receive = sck.Receive(buffer); и никогда ничего не делает?
1 ответ
Вы отправляете Modbus RTU PDU через соединение Modbus TCP, которое не будет работать. Вам необходимо создать PDU Modbus TCP с заголовком MBAP. Вы можете проверить детали здесь:
http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf