산업용 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를 설정하여 드라이브를 시작해야합니다.
지금은 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은 val == 1 일 때 모든 비트를 1로 설정하고 val == 0 일 때 모든 비트를 0으로 설정합니다. –
-val^명령은 val이 1 일 때 명령을 무효화합니다. –