मैं एक औद्योगिक पीएलसी प्रोग्रामिंग कर रहा हूं और मुझे एक वीएफडी के साथ एक प्रोफेसर-बस संचार के लिए बिट्स में हेरफेर करना है। मुझे 2byte स्थिति मिलती है और 2byte कमांड भेजना पड़ता है। इस परिचालन के लिए मुझे वीएफडी ऑपरेटिंग प्राप्त करने के लिए बिट सेट करना होगा। उदाहरण के लिए:सी थोड़ा सेट (बिट मैनिपुलेशन)
Byte n+1 Byte n
PLC --> --------------------- --------------- --> VFD
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
---------+--------- | | | | -+- | | +- 0: Reglersperre/Freigabe
| | | | | | | +--- 1: Freigabe/Schnellstopp
| | | | | | +----- 2: Freigabe/Halt
| | | | | +-------- 3..4: reserviert = 0
| | | | +------------5: Parametersatz-Umschaltung
| | | +------------- 6: Reset
| | +--------------- 7: reserviert = 0
| |
| +----------------- 8: Lüften der Bremse ohne Antreibsfreigabe
+---------------------------- 9..15: reserviert = 0
तो मुझे ऑपरेशन मोड में वीएफडी सेट करने के लिए बिट 0 सेट करना होगा। फिर मुझे ड्राइव शुरू करने के लिए बिट 2 सेट करने की आवश्यकता है।
अब मुझे question मिला जहां बिट-मैप्यूलेशन का वर्णन किया गया है और मुझे पता चला कि इस समाधान को काम करना चाहिए, लेकिन मैं वास्तव में इसे समझ नहीं पा रहा हूं।
क्या कोई यह बता सकता है कि यह क्यों काम करता है या काम नहीं करता है?
uint16_t change_bit(uint16_t command, unsigned int bit_nr, unsigned int val) {
/* command = 2byte command; bit_nr = bit to manipulate;
val = value bit should get (1;0) */
command ^= (-val^command) & (1U << bit_nr);
return command;
}
तुम सिर्फ सा 0 और बिट 2 1 पर सेट करने के लिए कोशिश कर रहे हैं:
यहाँ एक अधिक पठनीय शाखा संस्करण एक बदलाव के लिए एक बिटवाइज़ आपरेशन कारोबार है कि है? – dudeman
-val सभी बिट्स को 1 के रूप में सेट करता है जब वैल == 1 और सभी बिट्स 0 के रूप में वैल == 0। –
-val^कमांड कमांड करता है जब वह वैल 1 –