PLC Samkoon อ่านค่า Flow Meter ผ่าน Modbus RTU (MBUS) ไม่ได้ — ขึ้น Error 0x13 / 0x18 ทุกครั้ง แต่ Modbus Poll และ HMI อ่านได้ปกติ
อาการ
PLC Samkoon ตั้ง COM เป็น Modbus Master แล้วใช้คำสั่ง MBUS อ่านค่าจาก Thermal Gas Mass Flow Meter ผ่าน RS485 (Slave ID 1, FC03, 9600 / 8 / None / 1) แต่ Register สถานะของ MBUS ขึ้น 19 (0x13 = Station Number ในข้อมูลที่ได้รับไม่ตรงกับที่ส่งไป) หรือ 24 (0x18 = เฟรมที่ได้รับผิดพลาด ความยาวหรือ CRC ไม่ถูกต้อง) สลับกันไปทุกครั้ง ไม่มีครั้งไหนอ่านสำเร็จ แม้จะเว้นให้อ่านเพียงครั้งเดียวทุก 7 วินาที ในขณะที่ Modbus Poll บนคอมพิวเตอร์ผ่าน USB-RS485 Converter ใช้สายเส้นเดิมและค่าตั้งเดียวกันอ่านได้ถูกต้องทุกครั้ง และหน้าจอ HMI Samkoon ก็อ่านค่าจากมิเตอร์ตัวเดียวกันได้ปกติ หมายเหตุ: Register สถานะของ MBUS แสดงเป็นเลขฐานสิบ ต้องแปลงเป็นฐานสิบหกก่อนเทียบกับตาราง Information Code (19 = 0x13, 24 = 0x18)
สาเหตุ
มิเตอร์ตอบกลับถูกต้องทุกครั้ง (ตรวจ CRC ของเฟรมที่จับได้จาก Modbus Poll แล้ว) แต่เมื่อให้ PLC รับข้อมูลดิบในโหมด Free Port (คำสั่ง REV) พบว่าข้อมูลที่ PLC รับได้เสียหาย — คำตอบ 9 Byte (อ่าน 2 Register) เหลือ 7–9 Byte โดย Byte ช่วงต้นเพี้ยน ส่วนคำตอบ 29 Byte (อ่าน 12 Register) เหลือเพียง 19–25 Byte ยิ่งคำตอบยาวยิ่งเสียหายมาก แปลว่าพอร์ต RS485 ของ PLC รับสัญญาณจากมิเตอร์รุ่นนี้ได้ไม่สมบูรณ์ ขณะที่ USB-RS485 Converter และพอร์ตของ HMI รับได้ปกติ สาเหตุที่น่าจะเป็นที่สุดคือจังหวะเวลา (Baud Timing) ของสัญญาณจากมิเตอร์คลาดเคลื่อนเล็กน้อย ซึ่งอุปกรณ์อื่นทนได้แต่พอร์ตของ PLC ทนไม่ได้ (ยังไม่ได้ยืนยันด้วยออสซิลโลสโคป) ตรวจแล้วไม่ใช่สาเหตุ: ค่า 9600 / 8 / None / 1 ตรงกัน สายสัญญาณ (สายเส้นเดียวกันใช้กับ Modbus Poll ได้) ความถี่ในการอ่าน (อ่านทุก 7 วินาทีก็ยังไม่ได้) Bias Resistor (ต่อ USB-RS485 Converter ขนานเพิ่มแล้วอาการไม่เปลี่ยน) และค่า Frame Timeout ของ COM (ลองทั้ง 2 และ 5 ms)
วิธีแก้ไข
ก่อนใช้วิธีนี้ ยืนยันให้ได้ก่อนว่าเป็นอาการเดียวกัน คือ Modbus Poll อ่านมิเตอร์ได้ด้วยค่าตั้งเดียวกันและสายเส้นเดียวกัน ถ้า Modbus Poll ก็อ่านไม่ได้ ให้ตรวจสาย A / B, Baud Rate, Parity และ Slave ID ก่อน แก้โดยใช้ฟังก์ชัน Data Forwarding ของ HMI Samkoon ให้ HMI เป็น Master อ่านค่าจากมิเตอร์ทางพอร์ตหนึ่ง และเป็น Slave ให้ PLC อ่านค่าต่อทางอีกพอร์ตหนึ่ง PLC จึงไม่ต้องคุยกับมิเตอร์โดยตรง 1. ต่อสาย RS485 ของมิเตอร์ (A / B) เข้าพอร์ต COM ช่องหนึ่งของ HMI และต่อพอร์ต RS485 ของ PLC เข้าพอร์ต COM อีกช่องของ HMI 2. ใน SKTool ตั้งพอร์ตฝั่งมิเตอร์เป็น Modbus RTU Master ค่า 9600 / 8 / None / 1 (มิเตอร์รองรับ 9600 เท่านั้น) มิเตอร์เป็น Station 1 3. ตั้งพอร์ตฝั่ง PLC เป็น Modbus RTU Slave (HMI เป็น Slave) กำหนด Station Number ของ HMI แล้วตั้ง Baud Rate / Parity ให้ตรงกับ COM ของ PLC 4. ที่ Data Forwarding เพิ่มรายการแบบ Word ช่อง Source address เป็น LW ของ HMI (เช่น LW0) ช่อง Mapped address เป็น Register ของมิเตอร์ในรูปแบบ Station/4x… เลือก Data type แบบ 16-Bit เพื่อส่งต่อทีละ Word ตามจริงโดยไม่ต้องแปลงเป็น Float ที่ HMI แล้วตั้ง Number ให้ครบจำนวน Register ที่ต้องการ (สูงสุด 12) ให้ LW เรียงตรงกับ Register ของมิเตอร์ คือ LW0 = 40001 ไปจนถึง LW11 = 40012 (เทียบเลข 4x ของ SKTool กับค่าที่ Modbus Poll อ่านได้ที่ Address 0) 5. ฝั่ง PLC ใช้ MBUS อ่านจาก HMI ตามปกติ ตั้ง Station เป็น Station Number ของ HMI, FC03, Address 0 (LW0 ของ HMI คือ Holding Register Address 0) และ Length 12 เก็บลง D Register 6. ตรวจค่าใน PLC เทียบกับ Modbus Poll หรือหน้าจอมิเตอร์ ทุกค่าเป็น 32-bit Float เรียงแบบ Low Word ก่อน (CDAB) ซึ่งตรงกับที่ PLC Samkoon เก็บค่า 32 บิต จึงอ่าน D Register คู่นั้นเป็น Float ได้เลย ถ้าค่าออกมาเพี้ยนให้สลับ Word Register ของมิเตอร์ (40001–40012): • 40001–40002 อุณหภูมิ (คู่มือมิเตอร์ระบุว่ารุ่น Thermal Gas อ่านได้เป็น 0) • 40003–40004 อัตราการไหลขณะนั้น (Instantaneous Flow) • 40005–40006 ความเร็วการไหล (Nm/s) • 40007–40008 แรงดันของเซนเซอร์ • 40009–40010 ยอดสะสมส่วนหลักร้อยขึ้นไป • 40011–40012 ยอดสะสมส่วนต่ำกว่าหลักร้อย (ยอดสะสมจริง = ส่วนหลักร้อยขึ้นไป × 100 + ส่วนต่ำกว่าหลักร้อย) หมายเหตุ: คู่มือมิเตอร์ระบุให้เว้นระยะการสื่อสารแต่ละครั้งมากกว่า 6 วินาที (ทดสอบจริงอ่านทุก 1 วินาทียังได้) ถ้าค่าค้างหรือขาดหายให้ลดความถี่ในการอ่านลง