PDA

View Full Version : سوال: Modbus TCP/IP



masoode
سه شنبه 29 دی 1394, 19:10 عصر
با سلام خدمت دوستان
می دونید که یکی از پروتکلهای مهم برای ارتباط با تجهیزات برقی و اتوماسیون (نظیر PLCها) Modbus هست. مدباس به سه دسته کلی تقسیم می شه: Modbus ASCII، Modbus RTU و Modbus TCP/IP
دو دسته اول با استفاده از پورت سریال (RS232 یا RS485) کار می کنه و آخری با پورت اترنت یا همون کارت شبکه خودمون
من با دو روش اول به راحتی کار می کنم. اخیرا مجبور شدم در جایی از TCP/IP استفاده کنم. ظاهرا باید با استفاده از Indy یا Socket این کار انجام بشه
اگر می تونید سرنخ به من بدین تا از جای
ی شروع کنم. البته پروتکلهاش را خوندم و مثلا می دونم باید یک همچین رشته ای را به سمت اون دستگاه فرستاد و اون هم در جواب مقدار رجسیتری را که ما درخواست می دیم را برمیگردونه

in Modbus TCP is:

0001 0000 0006 11 03 006B 0003

0001: Transaction Identifier
0000: Protocol Identifier
0006: Message Length (6 bytes to follow)
11: The Unit Identifier (17 = 11 hex)
03: The Function Code (read Analog Output Holding Registers)
006B: The Data Address of the first register requested. (40108-40001 = 107 =6B hex)
0003: The total number of registers requested. (read 3 registers 40108 to 40110)

اما نمی دونم چطوری بفرستم و بگیرم!!

masoode
سه شنبه 29 دی 1394, 19:29 عصر
این هم فریمی که باید ارسال بشه (احتمالاً)

Mask
سه شنبه 29 دی 1394, 23:53 عصر
خوب در مورد ساختار فریمهای شبکه تحقیق کنید.
براحتی میشه همچین فریمی رو ساخت. فقط باید دستگاه در کنارتون باشه و تست کنید.

masoode
چهارشنبه 30 دی 1394, 10:11 صبح
دستگاه را دارم. فقط نمی دونم این فریم را با چه کامپوننتی ارسال و دریافت کنم! با Indy یه تلاشی کردم نشد! فکر کنم با سوکت بهتر باشه. یک منبع آن لاین برای کار باسوکت بهم معرفی کنید

Mask
چهارشنبه 30 دی 1394, 12:11 عصر
صددرصد با سوکت باید این کارو بکنی.indy یه پله بالاتره و به در شما نمیخوره.
بهترین منبع Help دلفی یا سایت امبرکادرو هست.
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Chat_Room_Socket_(Delphi)

ariobarzan
یک شنبه 04 بهمن 1394, 23:42 عصر
با سلام
لطفا اگر به مطلب مفیدی دست پیدا کردید به اشتراک بزارید
ممنون

masoode
شنبه 08 خرداد 1395, 10:21 صبح
من هنوز چیزی برای این کار پیدا نکردم. یک کامپوننتهایی هست که درست نصب نمیشن و پیداست که فایلهاشون ناقصن. اما یک چیزای پیدا کردم که با C# کار می کنه. شاید مجبور بشم برم سراغ C#
دوستان راهکاری برای من ندارید؟

masoode
شنبه 08 خرداد 1395, 11:40 صبح
تصمیم گرفتم دوباره خودم شروع کنم اما متاسفانه تا حالا سوکت پروگرمینگ کار نکرده ام. فکر کنم از INDY استفاده کنم بهتر باشه.
اگر درست متوجه شده باشم در کاربرد من، PLC یا دستگاه در موقعیت سرور هست و برنامه من باید client باشه و از indy client باید استفاده کنم.
البته در استاندارد Modbus به این صورت عمل می شه که اول کامپیوتر که در واقع (در کاربرد ما) Master است یک درخواست به سمت Slaveها می فرستد، سپس Slaveای که آدرسش در درخواست وجود دارد پاسخ را ارسال میکند و Master دریافت میکند.
حالا آیا باید از یک کامپوننت TIdTCPServer برای ارسال درخواست و یک TIdTCPClient برای دریافت پاسخ استفاده کنم؟

Mask
شنبه 08 خرداد 1395, 12:27 عصر
قبلا هم خدمتتون عرض کردم.برای این امور بهتره از سوکت استفاده بشه.

masoode
شنبه 08 خرداد 1395, 12:33 عصر
شما فرموده بودید
اما اگر بخوام یک رشته مثلا "0001 0000 0006 11 03 006B 0003" را بفرستم بفرمایید دقیقا از چه کامپوننتی استفاده کنم و برای دریافت پاسخ از چه کامپوننتی

Mask
یک شنبه 09 خرداد 1395, 14:18 عصر
اگه ملاک فقط این رشته در قالب رشته باشه هم با سوکت و هم با ایندی شدنیه.
شما در پستهای بالا حرف ساخت فریم اختصاصی رو زده بودید.

masoode
یک شنبه 09 خرداد 1395, 18:07 عصر
این رشته ای که مثال زدم از دل همون فریم استخراج شده. نهایتا فریمها معادل باینری یا هگز همین رشته باید باشد.
من برنامه ای دارم که به صورت کاملا سالم این فریم را تولید و ارسال و دریافت میکند. آیا شما نرم‌افزار می شناسید که بتوانم فریمهایی که روی پورت ارسال می شود را استراق سمع کنم دقیقا هویت فریم ها را می توانم به شما بگویم

Mask
یک شنبه 09 خرداد 1395, 19:14 عصر
وایرشارک سلام الله علیه

masoode
دوشنبه 10 خرداد 1395, 09:02 صبح
ممنون
اگر نتایجی بدست آوردم خبرتون می کنم