디폴트 0 (전달 데이터 없음)

중간 1 (두 바퀴 동기화)

전 2
후 3

좌 4
우 5

정지 6

Stop_Count  7

Stop_Count 카운트를 줄이는것까지 코딩 





CASE inPut OF
  1:
    IF -R_RPM > L_RPM THEN
      L_RPM := -R_RPM; 
    ELSE
      R_RPM := -L_RPM;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  2: 
     L_RPM := L_RPM + 1; R_RPM := R_RPM - 1;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  3:
     IF L_RPM >= 0 THEN
     L_RPM := L_RPM - 1; R_RPM := R_RPM + 1;
     END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  4:
    IF L_RPM > 0 THEN
      L_RPM := L_RPM - 1;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  5:
    IF R_RPM < 0 THEN
     R_RPM := R_RPM + 1;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  6: 
     R_RPM := 0; L_RPM := 0;

  7: Stop_Count := 100;

END_CASE;




CASE inPut OF
  1:
    IF -R_RPM > L_RPM THEN
      L_RPM := -R_RPM; 
    ELSE
      R_RPM := -L_RPM;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  2: 
     L_RPM := L_RPM + 1; R_RPM := R_RPM - 1;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  3:
     IF L_RPM > 0 THEN
     L_RPM := L_RPM - 1; R_RPM := R_RPM + 1;
     END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  4:
    IF L_RPM > 0 THEN
      L_RPM := L_RPM - 1;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  5:
    IF R_RPM < 0 THEN
     R_RPM := R_RPM + 1;
    END_IF;

    IF Stop_Count > 0 THEN
      Stop_Count := Stop_Count - 1;
    ELSE
      R_RPM := 0;
      L_RPM := 0;
    END_IF;

  6: 
     R_RPM := 0; L_RPM := 0;

  7: Stop_Count := 100;

END_CASE; 

Stop_Count 카운트를 줄이는것까지 코딩  후
 0이 되면 좌우 바퀴 0으로 설정


신고





Posted by 파란물














IF myBoolF = 1 THEN 
  CASE flag OF
    0: count := 1; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

IF myBoolB = 1 THEN 
  CASE flag OF
    0: count := 2; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

IF myBoolL = 1 THEN 
  CASE flag OF
    0: count := 3; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

IF myBoolR = 1 THEN 
  CASE flag OF
    0: count := 4; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

IF myBoolSY = 1 THEN 
  CASE flag OF
    0: count := 5; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

IF myBoolST = 1 THEN 
  flag := 0;
  CASE flag OF
    0: count := 6; flag := 1;
    1: count := 0;
  END_CASE;
END_IF;

BoolSum := myBoolF + myBoolB + myBoolL + myBoolR + myBoolSY + myBoolST;

CASE BoolSum OF
  0: flag := 0;
END_CASE;



//wxGlade의 ui 버튼값을 가져오는 곳입니다
// 각 버튼마다 아이디 값들이 있고 이 아이디 값에 해당하는 IF문을 통해 count변수에 0부터 6값을 담게 됩니다
// 버튼이 토글 버튼인 관계로 한번 count에 값이 담긴후 바로 0으로 바꾸기 위한 코딩 내용 입니다
 




CASE inPut OF
  0: L_RPM := L_RPM; R_RPM := R_RPM;
  1: L_RPM := L_RPM + 15; R_RPM := R_RPM - 15;
  2: 
    IF L_RPM > 0 THEN
      L_RPM := L_RPM - 15;
    END_IF;
    IF R_RPM < 0 THEN
      R_RPM := R_RPM + 15;
    END_IF;

  3:
    IF L_RPM > 0 THEN
      L_RPM := L_RPM - 15;
    END_IF;
  4: 
    IF R_RPM < 0 THEN
      R_RPM := R_RPM + 15;
    END_IF;
  5:
    IF -R_RPM > L_RPM THEN
      L_RPM := -R_RPM;
    ELSE
      R_RPM := -L_RPM;
    END_IF;
  6: R_RPM := 0; L_RPM := 0;

END_CASE;

// 각 버튼 별로 15이 더해지거나 15이 줄어들고 정지일 경우에는 0으로 뀝니다
// 왼쪽 오른쪽인 경우에는 15씩 줄게 코딩 되어 있습니다
// 


 

 


신고





Posted by 파란물





Name Inhibit time transmit PDO 1
Index 0x1800
Sub-index 0x03
Type UNSIGNED16
Access RW
Default Value 0
Value range


Description
This time is the minimum interval for event triggered PDO transmission. The value is defined as multiple of 100 μs.




신고





Posted by 파란물







 베레미즈에서 wxGlade의 UI의 모든 메서드의 기능은 사용할 수 있지만 사용자 정의 함수는 사용할수 없는거 같습니다 



 


위 그림처럼 wx.Button의 메서드는 두개 뿐입니다
그밖의 기능은 사용자가 직접 코딩해서 사용합니다


 




wxGlade에서 함수 기능을 설정하면 기본 구조는 소스 안에 정의 됩니다 
정의된 소스안에 코딩은 wxGlade의 UI프로그램으로 할 수 없고 소스를 열어 직접 코딩하게 됩니다

 여기서 문제가 되는것은 베레미즈는 빌드를 할때마다 빌드 폴더 내용 전체가 새로 갱신된다는데 있습니다
소스에 직접 코딩 내용을 적는다 해도 지워지고 맙니다

 일단 저는 이 문제를 해결하기 위해 베레미즈(beremiz)에서 다른 UI 기능으로 우회해서 프로그래밍 하는 방법을 생각해 보고 있습니다


저작자 표시 비영리 변경 금지
신고





Posted by 파란물






 베레미즈 기본 예제 tcp ip 마스터 프로젝트 빌드 했을때 CAN통신 설정 관련 한부분으로 수정했을시 소스코드에서 변경 되는 부분을 확인 했습니다
 
 이 소스들의 파일 위치는 프로젝트 내에 존지하며 베미즈에서 빌드 했을시 생성 됩니다 (buile 폴더 만들어짐) 
 베레미즈에서 클리어 버튼을 눌르면 빌드 폴더는 삭제되고 다시 빌드하면 새로 생성이 됩니다




이 파일은 영어로 달린 주석 번역과 약간의 소스 내용을 파악해서 추가로 주석 달았은 파일 입니다




CF_0.c 파일

/* Per master node slavebootup callbacks. Checks that
* every node have booted before calling Master_post_SlaveBootup */
int OD_0_0_slave_2_booted = 0;
int OD_0_0_slave_5_booted = 0;

static void OD_0_0_post_SlaveBootup(CO_Data* d, UNS8 nodeId){
switch(nodeId){
case 2:
OD_0_0_slave_2_booted = 1;
break;
case 5:
OD_0_0_slave_5_booted = 1;
break;
default:

break;
}
if( OD_0_0_slave_2_booted && OD_0_0_slave_5_booted )
Master_post_SlaveBootup(d,nodeId);
}



마스터에 슬래이브를 추가한 만큼 case문에 노드 아이디 번호로 추가 됩니다




CF_0.c 파일

/* CAN channels declaration */
BOARD_DECL(OD_0_0, "127.0.0.1", "125K")


nodename, busname, baudrate

마스터 아이디, 베레미즈 CAN_Device, CAN_Baudrate 값 변경시 적용됩니다



#ifndef NOT_USE_DYNAMIC_LOADING
if( !LoadCanDriver("can_peak_win32_USB.dll") ){
fprintf(stderr, "Cannot load CAN interface library for CanFestival (can_peak_win32_USB.dll)\n");\
fflush(stderr);\
return -1;\
}
#endif


드라이브 변경시 적용됨
베레미즈에서 확인된 메시지가 여기서 출력되었음




LOCATED_VARIABLES.h 파일

tcp IP 마스터 예제




__LOCATED_VAR(INT,__QW0_0_2_8193_0,Q,W,0,0,2,8193,0)
__LOCATED_VAR(INT,__IW0_0_2_8192_0,I,W,0,0,2,8192,0)

이곳에 사용자가 추가한 변수 내용들이 추가 됩니다



OD_0_0.c 소스 파일
이 파일에 networkedit 설정 내용이 있습니다

INTEGER16 beremiz__IW0_0_2_8192_0 = 0x0; /* Mapped at index 0x2302, subindex 0x01 */
INTEGER16 beremiz__QW0_0_2_8193_0 = 0x0; /* Mapped at index 0x4302, subindex 0x01 */

이 파일이 선언 되어 있습니다

소스 중간중간에 이 변수가 사용 됩니다



OD_0_0.h 소스파일
OD_0_0.c에 include 되어 있는 파일 입니다

extern INTEGER16 beremiz__IW0_0_2_8192_0; /* Mapped at index 0x2302, subindex 0x01 */
extern INTEGER16 beremiz__QW0_0_2_8193_0; /* Mapped at index 0x4302, subindex 0x01 */

이런 식으로 헤더에 선언 되어 있습니다





저작자 표시 비영리 변경 금지
신고





Posted by 파란물