私は工業用PLCをプログラミングしており、VFDとのprofi-bus通信のビットを操作する必要があります。私は2byteのステータスを取得し、2byteのコマンドを送信する必要があります。この操作では、VFDを動作させるビットを設定する必要があります。例:Cビット設定(ビット操作)
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
したがって、動作モードでVFDを設定するにはビット0を設定する必要があります。次に、ドライブを起動するためにビット2を設定する必要があります。
ここで私はを見つけました。このビット解読が記述されていますが、この解決策はうまくいくはずですが、実際には理解できません。
誰かがこれがうまくいかない理由を説明できますか?
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;
}
あなただけの1にビット0ビット2を設定しようとしていますか? – dudeman
- val val == 1のときはすべてのビットを1に設定し、val == 0のときはすべてのビットを0に設定します。 –
-val ^コマンドは、valが1のときにコマンドを無効にします。 –