2012-03-14 10 views
6

सी # से आज्ञा मैं पंख पीएलसी ईथरनेट मॉड्यूल के लिए पीसी (सी # नेट) (ओमरोन) से यूडीपी के माध्यम से आदेश भेजने का प्रयास करें, लेकिन पीएलसी से किसी भी प्रतिक्रिया नहीं मिल रहा है और कोई सुराग नहीं है जहाँ मैं है समस्या निवारण शुरू कर सकते हैं।भेजें पंख पीएलसी

पीएलसी पालन एक बहुत ही सरल सीढ़ी तर्क है: DM100 तो #0001 का महत्व है, तो उत्पादन 101.00 पर ट्रिगर। (यहाँ, "उत्प्रेरक" स्मृति क्षेत्र D100 के लिए केवल एक संकेत नाम है, और "आउटपुट" उत्पादन 101.00 के लिए एक प्रतीक है) enter image description here

तब मैं सी # का एक टुकड़ा है कि "लिखें मेमोरी क्षेत्र" के पंख आदेश करता है लिखा था जिसमें 01 02 का कमांड कोड है, इसके बाद पता, आइटमों की संख्या लिखी जानी चाहिए, और डेटा। 101.00 पर ट्रिगर करने के लिए सी # कोड को पीएलसी के D100 क्षेत्र में # 0001 का मान लिखना चाहिए।

[हटाए कोड वह काम नहीं करता] ..

उत्पादन 101.00 शुरू हो रहा था कि नहीं मिलता है, और न ही मैं किसी भी अपवाद प्राप्त करते हैं। मुझे यकीन है कि निम्नलिखित बना दिया है:

  1. पोर्ट, नोड और पते सही ढंग से कॉन्फ़िगर रूप से "काम ऑनलाइन" CX-प्रोग्रामर में की पुष्टि की। यह सुनिश्चित करने के लिए कि प्रत्येक नोड जुड़े हुए हैं, मैंने प्रत्येक आईपी को भी पिंग किया है।
  2. UdpClient कोड मान्य है क्योंकि मैंने एक बहुत ही सरल सर्वर/क्लाइंट कोड लिखा है जो सफलतापूर्वक पैकेट भेजता है और प्राप्त करता है।
  3. सीढ़ी तर्क में कोई समस्या नहीं है। मैंने सीढ़ी को पीएलसी में स्थानांतरित कर दिया और मॉनीटर मोड में वर्क ऑनलाइन द्वारा परीक्षण किया और D100 को मैन्युअल रूप से एक मान सेट किया।

मुझे लगता है fins_cmnd सरणी में गलती नहीं है, लेकिन के रूप में अपने कोड में देखा, मैं हर कीमत पर संभव के रूप में विस्तार के रूप में टिप्पणी की है; मैं संभवतः खुद को कुछ भी याद नहीं कर सकता। मुझे संदेह है कि मैं हेक्साडेसिमल को सही ढंग से पार्स नहीं कर सकता, लेकिन फिर, मुझे मार्गदर्शन करने के लिए मुझे कोई अपवाद नहीं है।

मुझे नहीं पता कि मैं कहां और कैसे समस्या निवारण कर सकता हूं। आशा है कि FINS प्रोग्रामिंग या पीएलसी अनुभव के साथ कोई मुझे कुछ मदद दे सकता है।

[उत्तर]
धन्यवाद Porge लिंक के लिए - कि मिल गया मुझे समस्या में पता चला। अंत में कुछ ट्रेल्स के बाद इसे काम करने के लिए मिलता है। कार्य कोड के लिए नीचे देखें।

string SERV_IP_ADDR = "192.168.250.1"; 
const int FINS_UDP_PORT = 9600; 

byte[] sendPacket = new byte[] 
{ 
    // Full UDP packet: 80 00 02 00 00 00 00 05 00 19 01 02 82 00 64 00 00 01 00 01 

    // Header 
    0x80, //0.(ICF) Display frame information: 1000 0001 
    0x00, //1.(RSV) Reserved by system: (hex)00 
    0x02, //2.(GCT) Permissible number of gateways: (hex)02 
    0x00, //3.(DNA) Destination network address: (hex)00, local network 
    0x00, //4.(DA1) Destination node address: (hex)00, local PLC unit 
    0x00, //5.(DA2) Destination unit address: (hex)00, PLC 
    0x00, //6.(SNA) Source network address: (hex)00, local network 
    0x05, //7.(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5 
    0x00, //8.(SA2) Source unit address: (hex)00, PC only has one ethernet 
    0x19, //9.(SID) Service ID: just give a random number 19 

    // Command 
    0x01, //10.(MRC) Main request code: 01, memory area write 
    0x02, //11.(SRC) Sub-request code: 02, memory area write 

    // PLC Memory Area 
    0x82, //12.Memory area code (1 byte): 82(DM) 

    // Address information 
    0x00, //13.Write start address (2 bytes): D100 
    0x64, 
    0x00, //15.Bit address (1 byte): Default 0 
    0x00, //16.No. of items (2 bytes): only one address which is D100 
    0x01, 

    // Write Data 
    0x00, //18.Data to write (2 bytes): value is 1 
    0x01, 
}; 

UdpClient client = new UdpClient(); //create a UdpClient instance 

try 
{ 
    client.Send(sendPacket, sendPacket.Length, SERV_IP_ADDR, FINS_UDP_PORT); 
} 
catch (SocketException se) 
{ 
    Console.WriteLine(se.ErrorCode + ": " + se.Message); 
} 

client.Close(); 

उत्तर

6

उन तारों में से कोई भी हेक्साडेसिमल के रूप में पार्स नहीं किया जाएगा। NumberStyles.AllowHexSpecifier हेक्साडेसिमल उपसर्ग "0x" की अनुमति देता है लेकिन यह उपस्थित होने तक हेक्स के रूप में संख्या को पार्स नहीं करता है।

तो आप (char)Int16.Parse("0x64", NumberStyles.AllowHexSpecifier) चाहते हैं।

हालांकि, सी # में संख्यात्मक अक्षर हेक्साडेसिमल हो सकता है, इसलिए ऐसा करने के बजाय आप केवल 0x64 लिख सकते हैं।

मैंने प्रोटोकॉल के लिए this page as a reference पर देखा है, और यह यूनिकोड कोड पॉइंट्स निर्दिष्ट करने और एएससीआईआई के रूप में बाइट्स को डीकोड करने के बजाए सीधे बाइट्स के रूप में संदेश बनाना बेहतर होगा। तुम भी सरणी विनिर्देश सिंटैक्स का उपयोग अव्यवस्था का एक बहुत दूर करने के लिए कर सकते हैं:

var message = new byte[] 
{ 
    // header 
    0x80, //(ICF) Display frame information: 1000 0001 
    0x00, //(RSV) Reserved by system: (hex)00 
    0x02, //(GCT) Permissible number of gateways: (hex)02 
    0x00, //(DNA) Destination network address: (hex)00, local network 
    0x00, //(DA1) Destination node address: (hex)00, local PLC unit 
    0x00, //(DA2) Destination unit address: (hex)00, PLC 
    0x00, //(SNA) Source network address: (hex)00, local network 
    0x05, //(SA1) Source node address: (hex)05, PC's IP is 192.168.250.5 
    0x00, //(SA2) Source unit address: (hex)00, PC only has one ethernet 
    0x19, //(SID) Service ID: just give a random number 19 

    // command 
    0x01, //(MRC) Main request code: 01, memory area write 
    0x02, //(SRC) Sub-request code: 02, memory area write 

    // data 
    0x82, //Memory area code, 2 bytes: 82(DM) 
    0x00, //Write start address DM100 
    0x64, 
    0x00, 
    0x00, //Word write: only one address 
    0x01, 
    0x00, //Write value of 1 to address DM100 (0000 0000 0000 0001) 
    0x01, // - this value is 0xaabbccdd -> cc dd aa bb 
    0x00, 
    0x00, 
}; 

यह भी लगता है कि वहाँ अपने डेटा अनुभाग के साथ कुछ समस्याएं भी हैं - जुड़े हुए दस्तावेज़ स्मृति पते के अनुसार 4 बाइट, लिखने होना चाहिए लंबाई 2 बाइट्स, और मूल्य 4 बाइट प्रत्येक। ये आपके पास जो कुछ है उसके साथ मेल नहीं खाते हैं, इसलिए मैंने उस सेक्शन का विस्तार किया है।

+0

स्मृति है, हाँ, 4 बाइट्स, इसलिए मेरे पास दो सरणी आइटम एक 0x00 और 0x64 एक साथ 4 बाइट हैं। क्योंकि प्रत्येक "सेक्शन" में केवल 16 बिट लगते हैं। – KMC

+0

@ केएमसी: मैंने 'डेटा' भाग का विस्तार किया है जो मुझे लगता है कि यह दिए गए पृष्ठ की तरह दिखने के लिए है। क्या इसने सहायता की? – porges

संबंधित मुद्दे