1️⃣ TSEND و TRCV: دستورات پایه TCP
"در ادامه مبحث قبلی مبنی بر پروتکلهای ارتباطی پشتیبانیشده توسط پورت PROFINET داخلی CPU (مروری بر TCP، ISO-on-TCP و UDP در PLC S7-1200) امروز قصد معرفی بلوک های مربوط به TCP و ISO-ON-TCP رو داریم. "
دستورات TSEND و TRCV بخش اصلی ارسال و دریافت داده در شبکه TCP هستند:
- TCON: ایجاد اتصال TCP/IP
- TSEND: ارسال داده
- TRCV: دریافت داده
- TDISCON: قطع اتصال
محدودیتها:
- برای هر اتصال باید TCON، TSEND/TRCV و TDISCON را جداگانه فراخوانی کنیم.
- TSEND نمیتواند دادههای Boolean ارسال کند و TRCV دادهها را به Boolean دریافت نمیکند.
- عملکرد آسنکرون دارد؛ یعنی یک دستور ممکن است بیش از یک سیکل ادامه یابد.
2️⃣ TSEND_C و TRCV_C: نسخه بهینه و ترکیبی
TSEND_C و TRCV_C ترکیبی از چند دستور پایه هستند:
- TSEND_C = TCON + TSEND + TDISCON
- TRCV_C = TCON + TRCV + TDISCON
مزایا:
- اتصال خودکار ایجاد، نگه داشته و مانیتور میشود.
- ارسال و دریافت داده سادهتر و قابل برنامهنویسی سریعتر است.
- پشتیبانی از TCP و ISO-on-TCP برای ارتباط CPU به CPU.
3️⃣ پروتکلهای مورد استفاده
پروتکل | ویژگیها |
---|---|
TCP | اتصالگرا، اطمینان از ارسال داده، مناسب برای دادههای متوسط تا بزرگ، آدرسدهی با پورت |
ISO-on-TCP (RFC 1006) | پروتکل پیامگرا، شناسایی پایان داده، مناسب WAN، استفاده از TSAP برای مدیریت چند اتصال به یک IP |
TSEND_C و TRCV_C میتوانند تحت هر دو پروتکل کار کنند.
4️⃣ وضعیت دستورها: BUSY, DONE, ERROR
BUSY | DONE | ERROR | توضیح |
---|---|---|---|
1 | 0 | 0 | عملیات در حال پردازش است |
0 | 1 | 0 | عملیات با موفقیت انجام شد |
0 | 0 | 1 | عملیات با خطا خاتمه یافت (جزئیات در STATUS) |
0 | 0 | 0 | هیچ عملیات جدیدی آغاز نشده است |
7️⃣ پارامترهای TSEND_C و TRCV_C
پارامترهای ورودی (IN / IN_OUT)
پارامتر | دستور | نوع داده | توضیح کوتاه |
---|---|---|---|
REQ | TSEND_C | Bool | آغاز ارسال داده با لبه بالا رونده |
EN_R | TRCV_C | Bool | فعالسازی دریافت داده |
CONT | TSEND_C/TRCV_C | Bool | کنترل اتصال: 0 = قطع اتصال بعد از ارسال/دریافت، 1 = ایجاد و نگهداری اتصال |
LEN | TSEND_C/TRCV_C | UDInt | حداکثر تعداد بایت برای ارسال یا دریافت داده |
ADHOC | TRCV_C | Bool | فعالسازی حالت Ad hoc برای TCP (اختیاری) |
CONNECT | TSEND_C/TRCV_C | Variant | اشارهگر به توضیحات اتصال (ساختارهای TCON_IP_v4، TCON_QDN، TCON_IP_V4_SEC و …) |
DATA | TSEND_C/TRCV_C | Variant | اشارهگر به ناحیه داده برای ارسال یا دریافت |
ADDR | TSEND_C/TRCV_C | Variant | آدرس مقصد در ارتباط UDP (اختیاری) |
COM_RST | TSEND_C/TRCV_C | Bool | راهاندازی مجدد دستور و اتصال (اختیاری) |
پارامترهای خروجی (OUT)
پارامتر | دستور | نوع داده | توضیح کوتاه |
---|---|---|---|
DONE | TSEND_C/TRCV_C | Bool | پایان موفقیتآمیز عملیات (یک سیکل) |
BUSY | TSEND_C/TRCV_C | Bool | وضعیت پردازش: 1 = در حال پردازش، 0 = آماده یا پایان یافته |
ERROR | TSEND_C/TRCV_C | Bool | 0 = بدون خطا، 1 = خطا در اتصال، ارسال یا دریافت |
STATUS | TSEND_C/TRCV_C | Word | جزئیات خطا و وضعیت دستور |
RCVD_LEN | TRCV_C | Int | تعداد بایت دریافت شده واقعاً |
💡 نکته: این جدول به خواننده کمک میکند تا بدون نگاه کردن به دفترچه مرجع، درک سریع و جامعی از نحوه کارکرد و پارامترهای TSEND_C و TRCV_C پیدا کند.
نکات مهم در استفاده از TSEND_C و TRCV_C
- شروع ارسال داده:
دستور TSEND_C تنها زمانی عملیات ارسال را شروع میکند که لبه پایین به بالا (low-to-high) در ورودی REQ رخ دهد.
- در طول پردازش، پارامتر BUSY = 1 است.
- پایان موفقیتآمیز عملیات با تنظیم DONE = 1 یا وقوع خطا با ERROR = 1 مشخص میشود (فقط برای یک سیکل نمایش داده میشود).
- در این مدت، هر لبه پایین به بالای جدید در REQ نادیده گرفته میشود.
- طول داده (LEN parameter):
- مقدار پیشفرض LEN = 0 باعث میشود که طول داده از پارامتر DATA استخراج شود.
- توصیه میشود که دادهای که TSEND_C ارسال میکند، هم اندازه با پارامتر DATA دستور TRCV_C باشد تا هماهنگی برقرار شود.
- ارسال داده در بخشهای کوچکتر از DATA:
- اگر دادهای که ارسال میشود اندازهای کمتر از پارامتر DATA دستور TRCV_C داشته باشد، TRCV_C در وضعیت BUSY باقی میماند تا مجموع دادههای ارسال شده توسط TSEND_C به اندازه DATA دستور TRCV_C برسد (کد وضعیت: 7006).
- تا زمانی که کل داده دریافت نشده باشد، TRCV_C محتوای جدید را در بافر DATA نمایش نمیدهد.
💡 نکته مهندسی:
این محدودیت باعث میشود که همیشه هماهنگی بین اندازه داده ارسالشده و بافر دریافت رعایت شود و از بروز خطاهای ناهماهنگ یا دادههای ناقص جلوگیری گردد.
عملکرد TSEND_C
دستور TSEND_C به صورت غیرهمزمان (asynchronous) اجرا میشود و سه عملکرد اصلی دارد:
1️⃣ راهاندازی و ایجاد اتصال
- زمانی که لبه پایین به بالا در REQ تشخیص داده شود و هنوز اتصال برقرار نشده باشد، TSEND_C اتصال را راهاندازی میکند.
- اتصال به صورت خودکار توسط CPU نگهداری و مانیتور میشود.
- برای ایجاد اتصال، پارامتر CONNECT مشخص میکند که اتصال چگونه برقرار شود.
- اگر CPU در حالت STOP قرار گیرد، اتصال قطع میشود و برای راهاندازی مجدد باید دستور TSEND_C دوباره اجرا شود.
2️⃣ ارسال داده از طریق اتصال موجود
- ارسال داده زمانی شروع میشود که لبه بالا رونده در REQ رخ دهد.
- ناحیه دادهای که باید ارسال شود با پارامتر DATA مشخص میشود (آدرس و طول داده).
- توجه: دادههای BOOL یا آرایه BOOL قابل استفاده نیستند.
- اگر از نام نمادین (symbolic) در DATA استفاده شود، مقدار LEN باید 0 باشد.
- دادهها تا پایان عملیات نباید تغییر کنند.
- مقدار LEN حداکثر تعداد بایت ارسالی در یک job را مشخص میکند.
3️⃣ قطع اتصال
- اتصال بعد از ارسال داده قطع میشود اگر CONT = 0 در زمان لبه بالا رونده REQ باشد.
- اگر CONT = 1، اتصال حفظ میشود.
- وقتی ارسال موفقیتآمیز باشد، DONE = 1 میشود.
- توجه: DONE = 1 تضمین نمیکند که دادهها توسط طرف مقابل خوانده شدهاند.
4️⃣ بازنشانی دستور (COM_RST)
- با COM_RST = 1، دستور TSEND_C بازنشانی میشود و اتصال یا انتقال داده فعلی قطع و دوباره برقرار میگردد.
- اگر در زمان بازنشانی داده در حال انتقال باشد، امکان از دست رفتن داده وجود دارد.
💡 نکته مهندسی:
پس از پایان یک job (DONE = 1)، برای اجرای دوباره TSEND_C، یک بار REQ = 0 بدهید تا آماده عملیات بعدی شود.
عملکرد TRCV_C
دستور TRCV_C به صورت غیرهمزمان (asynchronous) اجرا میشود و سه عملکرد اصلی دارد:
1️⃣ راهاندازی و ایجاد اتصال
- زمانی که EN_R = 1 باشد و اتصال موجود نباشد، TRCV_C اتصال را راهاندازی میکند.
- اتصال به صورت خودکار توسط CPU نگهداری و مانیتور میشود.
- اتصال با استفاده از پارامتر CONNECT و بسته به پروتکل زیر تنظیم میشود:
- TCP / UDP: TCON_IP_V4
- ISO-on-TCP: TCON_IP_RFC
- TCP امن: TCON_IP_V4_SEC
- TCP (FQDN): TCON_QDN / TCON_QDN_SEC
- اگر CPU در حالت STOP قرار گیرد، اتصال قطع میشود و برای راهاندازی مجدد باید دوباره TRCV_C با EN_R = 1 اجرا شود.
- اگر EN_R = 0 قبل از برقراری اتصال باشد، اتصال ایجاد میشود اما دادهای دریافت نمیشود (DONE = 0).
2️⃣ دریافت داده
- دریافت داده زمانی فعال میشود که EN_R = 1 باشد.
- دادههای دریافتی در ناحیه receive ذخیره میشوند.
- طول ناحیه دریافت با پارامتر LEN یا طول پارامتر DATA مشخص میشود.
- اگر از نام نمادین (symbolic) استفاده شود، LEN باید 0 باشد.
- اگر EN_R = 0 قبل از اولین دریافت داده باشد، اتصال برقرار میماند اما دادهای دریافت نمیشود.
3️⃣ قطع اتصال
- اتصال پس از دریافت داده قطع میشود اگر CONT = 0 در زمان شروع اتصال باشد.
- در غیر این صورت، اتصال حفظ میشود.
- وقتی دریافت داده موفقیتآمیز باشد، DONE = 1 میشود.
- اگر COM_RST فعال شود، TRCV_C بازنشانی میشود و در صورت دریافت داده در حال انتقال، امکان از دست رفتن داده وجود دارد.
5️⃣ نکته مهم
- TRCV_C همان حالتهای دریافت TRCV را پشتیبانی میکند.
- داده تا زمانی که اندازه کامل ناحیه DATA / LEN دریافت نشده باشد، در buffer نمایش داده نمیشود.
دیدگاه خود را بنویسید