हमारा लक्ष्य: यह लाइब्रेरी आपको अपना खुद का पीएलसी बनाने में मदद करने के लिए डिज़ाइन की गई है। इसका उद्देश्य फुलमैटिक सॉफ्ट के साथ प्रोग्राम करने योग्य उपकरणों का एक इकोसिस्टम बनाना है , जिससे आपको अपने हार्डवेयर पर अधिकतम नियंत्रण मिल सके । आप इस व्यापक लाइब्रेरी का उपयोग अपनी पसंद के किसी भी चिप और आईईडी के साथ कर सकते हैं। आप सर्किट डायग्राम और अन्य सभी हार्डवेयर स्पेसिफिकेशन्स खुद परिभाषित कर सकते हैं।
फुलमैटिक सॉफ्ट: निर्देशों के अनुसार अपने चिप कोड में फुलमैटिक कोर लाइब्रेरी जोड़ें, और अब आप लैडर ( IEC 61131-3 ) भाषा का उपयोग करके फुलमैटिक सॉफ्ट के साथ अपने एम्बेडेड सिस्टम को प्रोग्राम कर सकते हैं। फुलमैटिक सॉफ्ट आपको आधुनिक पीएलसी की सभी सुविधाओं के साथ-साथ टीसीपी, यूडीपी, मोशन और एसडी कार्ड कमांड भी प्रदान करता है। फुलमैटिक सॉफ्ट आपको 771 ब्लॉक (255 डीबी, 256 पीबी, 256 एफबी और 4 ओबी) और 16384 आईओ के साथ एक विशाल कार्यक्षेत्र प्रदान करता है।
फ्री पीएलसी फर्मवेयर: आप पीएलसी लाइब्रेरी का उपयोग 2048 बाइट्स तक मुफ्त में कर सकते हैं (1026 बाइट्स DB0 द्वारा उपयोग किए जाते हैं)। यदि आपको अधिक मेमोरी की आवश्यकता है, तो आपको लाइसेंस खरीदना होगा (10 USD) । लाइसेंस के बिना, पीएलसी 60 मिनट तक काम करेगा। हमारी पारदर्शी लाइसेंसिंग प्रणाली में कोई अनुबंध या जटिल प्रक्रिया नहीं है। आपको अपने सर्किट में TSHA204A-SSHDA चिप जोड़नी होगी। लाइसेंस खरीदने पर आपको एक कुंजी दी जाएगी। लाइसेंसिंग एप्लिकेशन इस कुंजी के साथ हमारे सर्वर से कनेक्ट होगा और सीरियल पोर्ट या ईथरनेट के माध्यम से चिप पर लाइसेंस कोड अपलोड करेगा। सर्वर पर आपके लाइसेंस की संख्या साथ-साथ कम होती जाएगी।
GitHub: आप GitHub से STM32F407VGTx के लिए VS Code में तैयार किया गया हमारा सैंपल प्रोजेक्ट डाउनलोड कर सकते हैं, जिससे आप PLC लाइब्रेरी का परीक्षण कर सकें। https://github.com/FultekPLC/Plc-Firmware
इस प्रोजेक्ट में आपको संपूर्ण पीएलसी फर्मवेयर मिलेगा, जो चिप की लगभग सभी विशेषताओं का उपयोग करता है और ओपन सोर्स के रूप में उपलब्ध है। आप क्यूब एमएक्स सॉफ्टवेयर का उपयोग करके चिप के हार्डवेयर स्पेसिफिकेशन्स को संशोधित कर सकते हैं और उसी प्रोजेक्ट पर काम जारी रख सकते हैं। आप वीएस कोड का उपयोग करके हार्डवेयर स्पेसिफिकेशन्स और सॉफ्टवेयर में भी बदलाव कर सकते हैं। आप पीएलसी फर्मवेयर में कस्टम फंक्शन जोड़ सकते हैं और उन्हें पीएलसी कोड के भीतर से चला सकते हैं। आप आईओ की संख्या और प्रकार निर्दिष्ट करके किसी भी ब्रांड और मॉडल की एआरएम चिप का उपयोग कर सकते हैं। संक्षेप में, आप लाइसेंस की शर्तों के अनुसार फुलमैटिक कोर लाइब्रेरी का बिना किसी प्रतिबंध के उपयोग कर सकते हैं।
फर्मवेयर अपडेट: आपके उत्पाद का उपयोग करने वाले ग्राहक फुलमैटिक सॉफ्ट के साथ पीएलसी फर्मवेयर अपडेट कर सकते हैं। पीएलसी फर्मवेयर अपडेट कोड पूरी तरह से ओपन सोर्स है, और आप उदाहरण प्रोजेक्ट में बूटलोडर कोड देख और संशोधित कर सकते हैं। हमारे द्वारा सुझाए गए कोड के अलावा, आप अपना खुद का बूटलोडर कोड भी लिख सकते हैं।



कोड गाइड
हम 256 KB के सैंपल प्रोजेक्ट को उपयोग में आसान बनाने के लिए काम कर रहे हैं। एक चिप के लिए 256 KB का कोड काफी बड़ा प्रोजेक्ट है। इतने बड़े प्रोजेक्ट को समझना, संशोधित करना और लागू करना आसान नहीं होगा। हमने इस पेज और कोड में फंक्शन्स को समझाने की कोशिश की है। हम उन्हें और बेहतर तरीके से समझाने पर भी काम कर रहे हैं। हम अपने GitHub रिपॉजिटरी के डिस्कशन सेक्शन में आपके सवालों के जवाब देने की पूरी कोशिश करेंगे। दुर्भाग्यवश, हम Fulmatic Core के लिए मुफ्त सपोर्ट नहीं देते हैं। आप सर्किट बोर्ड डिज़ाइन सहित सभी प्रक्रियाओं को आपके लिए संभालने के लिए हमसे कोटेशन मांग सकते हैं।
आप हमारे GitHub लिंक https://github.com/FultekPLC/Plc-Firmware से सैंपल प्रोजेक्ट डाउनलोड कर सकते हैं। सैंपल प्रोजेक्ट में, आप ओपन-सोर्स कोड का उपयोग करके PLC की सभी विशेषताओं को देख और संशोधित कर सकते हैं। आप अनावश्यक फ़ंक्शन हटा सकते हैं और नए फ़ंक्शन जोड़ सकते हैं।
हमारे GitHub रिपॉजिटरी में आपको IDE और बिल्ड टूल्स के बारे में सारी जानकारी मिल जाएगी। इस पेज पर हम आपके MCU कोड के साथ लाइब्रेरी इंटीग्रेशन के लिए उपयोग किए जाने वाले फंक्शन्स के बारे में बताएंगे।
FulmaticConfig.h
इस फाइल में फर्मवेयर संस्करण और स्ट्रिंग आकार की परिभाषाएँ दी गई हैं।
FulmaticCore.h
इस फ़ाइल में लाइब्रेरी के उन फ़ंक्शनों के हेडर शामिल हैं जिन्हें आप अपने MCU कोड से कॉल करेंगे। इस फ़ाइल में सभी फ़ंक्शनों का विवरण दिया गया है। यह लाइब्रेरी कई वैरिएबल और स्ट्रिंग के साथ काम करती है। आपको इन स्ट्रिंग और वैरिएबल को अपने MCU कोड में बनाना होगा। `variables_TypeDef` संरचना का उपयोग आपके द्वारा बनाए गए वैरिएबल को लाइब्रेरी में पास करने के लिए किया जाता है। आप इस संरचना को संशोधित नहीं कर सकते।
FulmaticInit : यह कमांड चिप को पहली बार चालू करते समय केवल एक बार चलाने की आवश्यकता होती है। 1 का मान यह दर्शाता है कि लाइसेंस चिप को सही ढंग से पढ़ लिया गया है और वह लाइसेंस के तहत काम कर रही है।
FulmaticExecute एक फ़ंक्शन है जिसे main.c के भीतर PLC लैडर कोड को निष्पादित करने के लिए कॉल किया जाता है। इसे स्टार्टअप ब्लॉक (जब PLC शुरू होता है), मेन ब्लॉक (प्रत्येक चक्र पर), शटडाउन ब्लॉक (जब PLC बंद होता है), Interrput.c में डिजिटल इनपुट इंटरप्ट होने पर और Fulmatic.c में समय-आधारित (टाइमर) इंटरप्ट होने पर कॉल किया जाता है।
फुलमैटिक.सी
आपके कोड में लाइब्रेरी के उपयोग के लिए आवश्यक सभी फ़ंक्शन Fulmatic.c फ़ाइल में एकत्रित हैं। यह फ़ाइल अन्य फ़ाइलों में विभाजित होती है। हमने फ़ंक्शन को चार शीर्षकों के अंतर्गत समूहित किया है। फ़ंक्शन का विवरण उस फ़ाइल में लिखा गया है जहाँ फ़ंक्शन का मुख्य भाग स्थित है।
- उदाहरण प्रोजेक्ट के लिए आवश्यक वे फ़ंक्शन जिनका उपयोग लाइब्रेरी द्वारा नहीं किया जाता है।
- लाइब्रेरी द्वारा उपयोग किए जाने वाले फ़ंक्शन जिन्हें आपके कोड में शामिल किया जाना आवश्यक है।
- पुस्तकालय द्वारा लाइसेंसिंग उद्देश्यों के लिए उपयोग किए जाने वाले फ़ंक्शन। बिना लाइसेंस के उपयोग के लिए इन फ़ंक्शनों की आवश्यकता नहीं है।
- लाइब्रेरी के कार्य पीएलसी में उपयोग किए जाने वाले कमांड पर निर्भर करते हैं। उदाहरण के लिए, यदि आपके पीएलसी में टीसीपी, यूडीपी, एसपीआई, सीरियल पोर्ट और एसडी कार्ड जैसे कार्यों का उपयोग नहीं किया जाता है, तो लाइब्रेरी इन कार्यों के बिना भी काम करेगी।
_DefaultEprom: फुलमैटिक सॉफ्ट के साथ चयनित किए जा सकने वाले हार्डवेयर सेटिंग्स PlcSetupEprom[STPMEMORYSIZE] और लैडर कोड एरे, PlcEprom[PRGMEMORYSIZE] में संग्रहीत होते हैं। इस फ़ाइल में मौजूद _DefaultEprom फ़ंक्शन में PLC की डिफ़ॉल्ट सेटिंग्स होती हैं। आप अपने कोड में इन एरे का उपयोग करके कॉन्फ़िगरेशन को कुछ हद तक अनुकूलित कर सकते हैं।
`_EachMilliSecond`: यह फ़ंक्शन, जो हर मिलीसेकंड में चलता है, मुख्य फ़ाइल और लाइब्रेरी के भीतर से निष्पादित होता है। उदाहरण प्रोजेक्ट में, फ़्लैग `Interrupt.c` में `TIM7_IRQHandler` का उपयोग करके सेट किए जाते हैं, सीधे निष्पादित नहीं होते। इसके अतिरिक्त, `TIM7->ARR` मान को RTC के साथ कैलिब्रेट किया जाता है। कृपया `Fulmatic.c` में `_RtcCalibration` फ़ंक्शन की जाँच करें। गलत कैलिब्रेशन के कारण PLC में सभी समय-आधारित ऑपरेशन मामूली त्रुटियों के साथ चलेंगे।
_DelayUs: चिप की आवृत्ति के अनुसार सटीक सेटिंग सुनिश्चित करने के लिए आपको कोड में संशोधन करने की आवश्यकता हो सकती है। आपको इसे लंबे समय तक परीक्षण और अंशांकन करना चाहिए। यह 168 मेगाहर्ट्ज के लिए अंशांकित है।
_SetOutputs: सामान्यतः, main.c में इनपुट पढ़े जाते हैं और आउटपुट लिखे जाते हैं। हालाँकि, जब समय-आधारित या डिजिटल इनपुट इंटरप्ट होते हैं, तो OB2 इंटरप्ट ब्लॉक सक्रिय हो जाता है। फिर इसे लाइब्रेरी के भीतर से कॉल किया जाता है ताकि आउटपुट को बिना किसी देरी के सेट किया जा सके।
_GetMsTimerCount : कई ऑपरेशनों में समय अवधि मापने के लिए उपयोग किया जाता है। यह आपके कोड में मौजूद होना चाहिए। आपको मिलीसेकंड टाइमर मान पढ़ने को सक्षम करना होगा।
_CrcCalculate: हार्डवेयर का उपयोग करके चेकसम की गणना करने के लिए उपयोग किया जाता है। आपको यह सुनिश्चित करना होगा कि यह आपके द्वारा उपयोग किए जा रहे चिप के अनुसार सही ढंग से काम करता है।
संचार.सी
इस फ़ाइल में पीएलसी के भीतर ईथरनेट, सीरियल पोर्ट और एसपीआई का उपयोग करने के लिए आवश्यक कोड शामिल है। मॉडबस और फुलमैटिक सॉफ्ट से आने वाले कॉल इसी फ़ाइल में प्राप्त होते हैं। main.c से विलंब के साथ प्रतिक्रिया शुरू करके डेटा की स्थिरता सुनिश्चित की जाती है। इसके अतिरिक्त, फ़र्मवेयर अपडेट और एसडी कार्ड कोड भी इसी फ़ाइल में स्पष्ट रूप से लिखा गया है। फुलमैटिक सॉफ्ट इसी कोड का उपयोग करके फ़र्मवेयर अपडेट और एसडी कार्ड संबंधी कार्य करता है। आप फुलमैटिक सॉफ्ट के बजाय अपने स्वयं के सॉफ़्टवेयर के साथ समान कार्य करने के लिए इस कोड को संशोधित कर सकते हैं। अन्य फुलमैटिक सॉफ्ट और मॉडबस संबंधी कार्य इसी कोड के माध्यम से लाइब्रेरी को भेजे जाते हैं और लाइब्रेरी द्वारा उनका उत्तर दिया जाता है। कोड को संशोधित करके, आप मॉडबस कॉल का उत्तर लाइब्रेरी को भेजे बिना भी दे सकते हैं।
फ्लैश.सी
पीएलसी बंद होने पर पीएलसी कोड और परसिस्टेंट टाइमर-काउंटर की जानकारी फ्लैश ड्राइव में सेव हो जाती है। पीएलसी को दोबारा चालू करने पर, फ्लैश.h फ़ाइल से आखिरी सेव किया गया कोड पढ़ा जाता है। कृपया अपने द्वारा उपयोग किए जा रहे चिप के सेक्टर की जानकारी सेट करना न भूलें। पीएलसी बंद होने का पता लगाने के लिए आप निम्नलिखित सर्किट का उपयोग कर सकते हैं।

यह सर्किट वोल्टेज 24 वोल्ट से घटकर लगभग 19 वोल्ट होने पर शटडाउन डिटेक्ट पिन को लो कर देगा। C1 कैपेसिटर चिप को थोड़े समय के लिए चालू रखने की अनुमति देता है। इस विस्तारित अवधि के दौरान, फ्लैश मेमोरी को मिटाना और फिर से लिखना जोखिम भरा है। इसलिए, निम्नलिखित चरणों का पालन करना आवश्यक है।
- जब पीएलसी को पहली बार चालू किया जाता है, तो हम सेक्टर 10 को सेक्टर 11 में कॉपी करते हैं। यदि स्टार्टअप के दौरान बिजली बाधित होती है, तो सेक्टर 11 में डेटा अक्षुण्ण रूप से संग्रहीत रहता है।
- फ्लैश में नया डेटा सेव करने के लिए, पहले उसे डिलीट करना ज़रूरी है। डिलीट करने में सेव करने से कहीं ज़्यादा समय लगता है। इसलिए, हम स्टार्टअप के समय सेक्टर 10 को डिलीट कर देते हैं और शटडाउन होने का इंतज़ार करते हैं।
- शटडाउन डिटेक्शन सर्किट हमें 1 सेकंड से थोड़ा अधिक समय देता है। शटडाउन का पता चलने पर, डेटा 100-200 मिलीसेकंड के भीतर सेक्टर 10 में सहेजा जाता है। चूंकि OB 1 शटडाउन ब्लॉक शटडाउन से पहले चलेगा और PLC में बड़ा लैडर कोड हो सकता है, इसलिए C1 कैपेसिटर कम से कम 2200 µF का होना चाहिए। उच्च कैपेसिटेंस से सर्किट में करंट का झटका लगने से बचाने के लिए 100 ओम का करंट लिमिटिंग रेसिस्टर लगाया जाता है।
- पीएलसी के चालू होने पर, यह सेक्टर 10 में मौजूद सभी डेटा को पढ़ता है और चेकसम की जाँच करता है। यदि पीएलसी के चालू होने के दौरान बिजली बाधित हो जाती है, तो चेकसम की जाँच विफल हो जाएगी। घबराएँ नहीं, सेक्टर 11 में हमेशा विश्वसनीय डेटा उपलब्ध रहता है। पीएलसी का चालू होना स्वचालित रूप से सेक्टर 11 से होता है।
Interrupt.c
डिजिटल इनपुट, ADC, टाइमर और UART इंटरप्ट इस फ़ाइल में मौजूद हैं। इन्हें Fulmatic.c में मौजूद _INTSetup फ़ंक्शन के ज़रिए PLC के ऑपरेटिंग मोड के अनुसार चालू या बंद किया जाता है। _INTSetup कोड को अपने हार्डवेयर के अनुसार ढालना न भूलें। इस फ़ाइल में मौजूद फ़ंक्शन तेज़ी से चलने चाहिए। हमारे उदाहरण कोड में, हमने कोड की पठनीयता बढ़ाने के लिए स्विच कमांड का इस्तेमाल किया है। हालाँकि, इसे और भी तेज़ी से चलाने के तरीके हैं। उदाहरण के लिए, स्विच कमांड के अंदर के ऑपरेशन्स को अलग-अलग फ़ंक्शन के रूप में लिखा जा सकता है।
- शून्य हैंडल_एनकोडर(शून्य)
- शून्य (*EXTI0_हैंडलर_पीटीआर)(शून्य);
- INTSetup में Fulmatic SOFT के साथ किए गए चयन के आधार पर: EXTI0_Handler_Ptr = Handle_Encoder;
- जब कोई इंटरप्ट होता है: EXTI0_IRQHandler के अंदर EXTI0_Handler_Ptr() चलाएँ।
एक अन्य त्वरण विधि बाइट-से-32 बिट रूपांतरण है। आप STM श्रृंखला के लिए इस कोड का उपयोग कर सकते हैं: *(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);
हमें इंटरप्ट फ्लैग साफ़ करने के लिए HAL लाइब्रेरी का उपयोग नहीं करना चाहिए। इसके बजाय, हमें रजिस्टर मान को सीधे संशोधित करने की तेज़ विधि को प्राथमिकता देनी चाहिए। TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
डिजिटल इनपुट इंटरप्ट: इनका उपयोग हाई-स्पीड काउंटर, एनकोडर और इसी तरह के अनुप्रयोगों के लिए किया जाता है।
एडीसी: हम डीएमए का उपयोग नहीं करते; हम इंटरप्ट के भीतर एडीसी रीड ऑपरेशन करते हैं। इससे हमें फ़िल्टरिंग ऑपरेशन करने की सुविधा मिलती है।
टाइमर: हम इसका उपयोग एक मिलीसेकंड के टाइमर और पीटीओ आउटपुट के लिए करते हैं। टाइमर का केवल हर मिलीसेकंड पर इंटरप्ट करना पर्याप्त नहीं है; इसे 0 से 999 तक गिनती भी करनी होगी।
USART: सीरियल पोर्ट इंटरप्ट का उपयोग डेटा ट्रांसमिशन और रिसेप्शन के लिए किया जाता है। इसके अतिरिक्त, Fulmatic.c -> _EachMilliSecond में RS485 इनेबल पिन ऑपरेशन शामिल हैं।
एसडीकार्ड.सी
इस फ़ाइल में SD कार्ड से संबंधित कार्य किए जाते हैं। आप इसे हमारे उदाहरण प्रोजेक्ट से अलग तरीके से भी कर सकते हैं। PLC पर फ़ाइलें अपलोड या डाउनलोड करने के लिए संचार कोड Communication.c फ़ाइल में ओपन सोर्स में लिखे गए हैं। आप Fulmatic SOFT का उपयोग करके फ़ाइलें अपलोड और डाउनलोड कर सकते हैं। यदि आपके प्रोजेक्ट में SD कार्ड नहीं है, तो आप सभी फ़ंक्शन हटा सकते हैं।
मुख्य
Cube MX में प्रोजेक्ट सेव करने पर यह फ़ाइल हर बार बदल जाएगी। यह सुनिश्चित करने के लिए कि आपके कमांड अपरिवर्तित रहें, आपको अपना कोड Cube MX में आपके कोड के लिए आरक्षित क्षेत्रों में लिखना होगा। /* उपयोगकर्ता कोड प्रारंभ 2 */ अपना कोड यहाँ लिखें। /* उपयोगकर्ता कोड समाप्त 2 */
आप इस फ़ाइल में लाइब्रेरी के लिए आवश्यक सभी वैरिएबल बना सकते हैं। आपको विशिष्ट पते पर बड़े एरे बनाने की आवश्यकता हो सकती है। `uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`
while लूप के भीतर की सभी क्रियाओं का ध्यानपूर्वक अध्ययन करें। आपके द्वारा किए गए किसी भी बदलाव से समग्र संरचना में कोई व्यवधान नहीं आना चाहिए। आपके प्रोग्राम के अन्य भागों में लिखा गया कोड इस लूप की गति को धीमा नहीं करना चाहिए।
