【发布时间】:2017-01-12 13:10:56
【问题描述】:
我正在对工业 plc 进行编程,并且我必须操作位以与 VFD 进行 profi-bus 通信。我得到一个 2 字节的状态并且必须发送 2 字节的命令。对于此操作,我必须设置位以使 VFD 运行。例如:
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 以将 VFD 设置为操作模式。然后我需要设置位 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?
-
-val 在 val==1 时将所有位设置为 1,在 val==0 时将所有位设置为 0。
-
这只是一个例子,我要操作很多不同的命令,所以我想写一个函数,我可以通用。
-
不清楚“命令”应该是什么。您希望将特定位置的位设置为 1 或 0,或者您希望根据某些模式/命令设置多个位。您的功能似乎同时尝试两者,这对我来说没有意义。
-
那么看起来你只是想做这样的事情?
uint16_t change_bit (uint16_t value, bool set, size_t bit_n) { if(set) return value | (1u << bit_n); else return value &= ~(1u << bit_n); }.
标签: c bit-manipulation plc