달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

var
  AA: TDateTime;
begin
  AA := Now();

  // 1시간 더하기
  AA := AA + (1/24);

  // 1분 더하기
  AA := AA + (1/(24*60));

  // 1초 더하기
  AA := AA + (1/(24*60*60));
end;

살펴보면 규칙이 보일겁니다.

TDateTime은 하루를 1로 계산합니다.

따라서,

1시간은 1일/24시간
1분은 1일/(24시간 * 60분)
1초는 1일/(24시간 * 60분 * 60초)

가 되는 겁니다.

궁금 님이 쓰신 글 :
: 델파이에서 now 해서 시간을 찍어보면
:
: 2006-10-10 오전 07:08:11 이렇게 나오는데 여기에 초를 더하면 시간을 알아서 계산해주는 함수가 있나요?
:
: 수동으로 하려면 오전인지 오후인지 판단해서 24시간으로 바꾸고 거기서 초를더해서
: 만약 24시간을 넘어가면 2006-10-10 에 해당하는 날짜를 +1해주고 나머지값을 시간에셋팅해주고 등등 번거로운데요..걍 간단히 tdatetime 형의 시간에 1초를더한 날짜/시간을
: 계산해주는함수가있는지요??
:
: 프로그램시작시에 현재시간을 tdatetime변수에 넣어두고.. tickcount를 계산해서..
: 현재시간에서 초를 계속더해서..윈도우시계와는상관없이.. 독자적인 시간을 만들려고하거든요! 근데 현재시간을 저장해뒀다가 지나간tick을초로환잔해서 더할때마다 시간계산이 복잡해서리..--;

 

 

출처  : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=11140

Posted by theF
|
  { Virtual Keys, Standard Set }
  {$EXTERNALSYM VK_LBUTTON}
  VK_LBUTTON = 1;
  {$EXTERNALSYM VK_RBUTTON}
  VK_RBUTTON = 2;
  {$EXTERNALSYM VK_CANCEL}
  VK_CANCEL = 3;
  {$EXTERNALSYM VK_MBUTTON}
  VK_MBUTTON = 4;  { NOT contiguous with L & RBUTTON }
  {$EXTERNALSYM VK_BACK}
  VK_BACK = 8;
  {$EXTERNALSYM VK_TAB}
  VK_TAB = 9;
  {$EXTERNALSYM VK_CLEAR}
  VK_CLEAR = 12;
  {$EXTERNALSYM VK_RETURN}
  VK_RETURN = 13;
  {$EXTERNALSYM VK_SHIFT}
  VK_SHIFT = $10;
  {$EXTERNALSYM VK_CONTROL}
  VK_CONTROL = 17;
  {$EXTERNALSYM VK_MENU}
  VK_MENU = 18;
  {$EXTERNALSYM VK_PAUSE}
  VK_PAUSE = 19;
  {$EXTERNALSYM VK_CAPITAL}
  VK_CAPITAL = 20;
  {$EXTERNALSYM VK_KANA }
  VK_KANA = 21;
  {$EXTERNALSYM VK_HANGUL }
  VK_HANGUL = 21;
  {$EXTERNALSYM VK_JUNJA }
  VK_JUNJA = 23;
  {$EXTERNALSYM VK_FINAL }
  VK_FINAL = 24;
  {$EXTERNALSYM VK_HANJA }
  VK_HANJA = 25;
  {$EXTERNALSYM VK_KANJI }
  VK_KANJI = 25;
  {$EXTERNALSYM VK_CONVERT }
  VK_CONVERT = 28;
  {$EXTERNALSYM VK_NONCONVERT }
  VK_NONCONVERT = 29;
  {$EXTERNALSYM VK_ACCEPT }
  VK_ACCEPT = 30;
  {$EXTERNALSYM VK_MODECHANGE }
  VK_MODECHANGE = 31;
  {$EXTERNALSYM VK_ESCAPE}
  VK_ESCAPE = 27;
  {$EXTERNALSYM VK_SPACE}
  VK_SPACE = $20;
  {$EXTERNALSYM VK_PRIOR}
  VK_PRIOR = 33;
  {$EXTERNALSYM VK_NEXT}
  VK_NEXT = 34;
  {$EXTERNALSYM VK_END}
  VK_END = 35;
  {$EXTERNALSYM VK_HOME}
  VK_HOME = 36;
  {$EXTERNALSYM VK_LEFT}
  VK_LEFT = 37;
  {$EXTERNALSYM VK_UP}
  VK_UP = 38;
  {$EXTERNALSYM VK_RIGHT}
  VK_RIGHT = 39;
  {$EXTERNALSYM VK_DOWN}
  VK_DOWN = 40;
  {$EXTERNALSYM VK_SELECT}
  VK_SELECT = 41;
  {$EXTERNALSYM VK_PRINT}
  VK_PRINT = 42;
  {$EXTERNALSYM VK_EXECUTE}
  VK_EXECUTE = 43;
  {$EXTERNALSYM VK_SNAPSHOT}
  VK_SNAPSHOT = 44;
  {$EXTERNALSYM VK_INSERT}
  VK_INSERT = 45;
  {$EXTERNALSYM VK_DELETE}
  VK_DELETE = 46;
  {$EXTERNALSYM VK_HELP}
  VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
  {$EXTERNALSYM VK_LWIN}
  VK_LWIN = 91;
  {$EXTERNALSYM VK_RWIN}
  VK_RWIN = 92;
  {$EXTERNALSYM VK_APPS}
  VK_APPS = 93;
  {$EXTERNALSYM VK_NUMPAD0}
  VK_NUMPAD0 = 96;
  {$EXTERNALSYM VK_NUMPAD1}
  VK_NUMPAD1 = 97;
  {$EXTERNALSYM VK_NUMPAD2}
  VK_NUMPAD2 = 98;
  {$EXTERNALSYM VK_NUMPAD3}
  VK_NUMPAD3 = 99;
  {$EXTERNALSYM VK_NUMPAD4}
  VK_NUMPAD4 = 100;
  {$EXTERNALSYM VK_NUMPAD5}
  VK_NUMPAD5 = 101;
  {$EXTERNALSYM VK_NUMPAD6}
  VK_NUMPAD6 = 102;
  {$EXTERNALSYM VK_NUMPAD7}
  VK_NUMPAD7 = 103;
  {$EXTERNALSYM VK_NUMPAD8}
  VK_NUMPAD8 = 104;
  {$EXTERNALSYM VK_NUMPAD9}
  VK_NUMPAD9 = 105;
  {$EXTERNALSYM VK_MULTIPLY}
  VK_MULTIPLY = 106;
  {$EXTERNALSYM VK_ADD}
  VK_ADD = 107;
  {$EXTERNALSYM VK_SEPARATOR}
  VK_SEPARATOR = 108;
  {$EXTERNALSYM VK_SUBTRACT}
  VK_SUBTRACT = 109;
  {$EXTERNALSYM VK_DECIMAL}
  VK_DECIMAL = 110;
  {$EXTERNALSYM VK_DIVIDE}
  VK_DIVIDE = 111;
  {$EXTERNALSYM VK_F1}
  VK_F1 = 112;
  {$EXTERNALSYM VK_F2}
  VK_F2 = 113;
  {$EXTERNALSYM VK_F3}
  VK_F3 = 114;
  {$EXTERNALSYM VK_F4}
  VK_F4 = 115;
  {$EXTERNALSYM VK_F5}
  VK_F5 = 116;
  {$EXTERNALSYM VK_F6}
  VK_F6 = 117;
  {$EXTERNALSYM VK_F7}
  VK_F7 = 118;
  {$EXTERNALSYM VK_F8}
  VK_F8 = 119;
  {$EXTERNALSYM VK_F9}
  VK_F9 = 120;
  {$EXTERNALSYM VK_F10}
  VK_F10 = 121;
  {$EXTERNALSYM VK_F11}
  VK_F11 = 122;
  {$EXTERNALSYM VK_F12}
  VK_F12 = 123;
  {$EXTERNALSYM VK_F13}
  VK_F13 = 124;
  {$EXTERNALSYM VK_F14}
  VK_F14 = 125;
  {$EXTERNALSYM VK_F15}
  VK_F15 = 126;
  {$EXTERNALSYM VK_F16}
  VK_F16 = 127;
  {$EXTERNALSYM VK_F17}
  VK_F17 = 128;
  {$EXTERNALSYM VK_F18}
  VK_F18 = 129;
  {$EXTERNALSYM VK_F19}
  VK_F19 = 130;
  {$EXTERNALSYM VK_F20}
  VK_F20 = 131;
  {$EXTERNALSYM VK_F21}
  VK_F21 = 132;
  {$EXTERNALSYM VK_F22}
  VK_F22 = 133;
  {$EXTERNALSYM VK_F23}
  VK_F23 = 134;
  {$EXTERNALSYM VK_F24}
  VK_F24 = 135;
  {$EXTERNALSYM VK_NUMLOCK}
  VK_NUMLOCK = 144;
  {$EXTERNALSYM VK_SCROLL}
  VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
  Used only as parameters to GetAsyncKeyState() and GetKeyState().
  No other API or message will distinguish left and right keys in this way. }
  {$EXTERNALSYM VK_LSHIFT}
  VK_LSHIFT = 160;
  {$EXTERNALSYM VK_RSHIFT}
  VK_RSHIFT = 161;
  {$EXTERNALSYM VK_LCONTROL}
  VK_LCONTROL = 162;
  {$EXTERNALSYM VK_RCONTROL}
  VK_RCONTROL = 163;
  {$EXTERNALSYM VK_LMENU}
  VK_LMENU = 164;
  {$EXTERNALSYM VK_RMENU}
  VK_RMENU = 165;
  {$EXTERNALSYM VK_PROCESSKEY}
  VK_PROCESSKEY = 229;
  {$EXTERNALSYM VK_ATTN}
  VK_ATTN = 246;
  {$EXTERNALSYM VK_CRSEL}
  VK_CRSEL = 247;
  {$EXTERNALSYM VK_EXSEL}
  VK_EXSEL = 248;
  {$EXTERNALSYM VK_EREOF}
  VK_EREOF = 249;
  {$EXTERNALSYM VK_PLAY}
  VK_PLAY = 250;
  {$EXTERNALSYM VK_ZOOM}
  VK_ZOOM = 251;
  {$EXTERNALSYM VK_NONAME}
  VK_NONAME = 252;
  {$EXTERNALSYM VK_PA1}
  VK_PA1 = 253;
  {$EXTERNALSYM VK_OEM_CLEAR}
  VK_OEM_CLEAR = 254;

ShowMessage(IntToStr(Ord(Key)));

Posted by theF
|

 StringReplace(DataBuf,' ','',[rfReplaceAll]) ;


  -> 문제가 가끔 있다.  내가 경험한 빡치는 상황은

텍스트 파일을 while 문으로 한 줄씩 읽고 해당 줄의 공백을 제거 하는건데..

공백 제거가 안된다.  ㅜㅜ


버튼 하나 만들어서 while 안쓰고 하면 잘 된다..



검색해 봤다.while 문으로 공백을 제거하는 간단한 코드가 있다.

존경스럽다.



원문링크


function gfDel32(s: string): string;
begin
 while not(pos(' ',s)=0) do delete(s,pos(' ',s),1);
 result:=s;
end;

아니면 자체 내장함수인 StringReplace 을 사용하면

str := StringReplace(str1, ' ', '', [rfReplaceAll, rfIgnoreCase]);



참고.

원문 블로그 주인분이 암 투병 중이시다.  쾌차하셔서  산좋고 물좋은 곳에서 요양중이시길 바래본다.

Posted by theF
|

 lib 목록


 - Tled, Tindicator, logmeter,scope....




Posted by theF
|

Component 메뉴 - Install Package - Add


델파이 bin 폴더 안에 dclqrt70.bpl 을 선택



끝.

Posted by theF
|

Component -> Install Packages


델파이 7 설치 폴더에 bin


dclSockets70.bpl -> add 



끝  .



Posted by theF
|

var

 

    aHandle : THandle;

    PID : Integer;

 

aHandel := FindWindow ('TfrmMain',nil);                      //첫번째 인자는 클래스명(델파이 제작프로그램)

 

aHandel := FindWindow('NotePad',nil);                          //메모장등은 프로그램명만 

또는

aHandel := FindWindow(nil,'제목 없음 - 메모장');            //캡션만

또는

aHandel := FindWindow('NotePad','제목 없음 - 메모장'); //둘다 알때

Posted by theF
|
procedure TForm1.Button1Click(Sender: TObject);
var
  time1,time2,ptime, msecday : TTimeStamp;
  //msecday1 : Double;
  itmp1, tmp1,tmp2,tmp3, tmp4,tmp5,tmp6,tmp7 : integer;
begin
 //msecday1 := (1/(24*60*60));
  time1 := DateTimeToTimeStamp(StrToDateTime('2000-02-02 02:50:00'));
  time2 := DateTimeToTimeStamp(StrToDateTime('2000-02-03 05:51:20'));

  ptime.Time := time2.Time - time1.Time;
  ptime.Date := time2.Date - time1.Date;

  if ptime.Time < 0 then begin
    Dec(ptime.Date);
    ptime.Time := MSecsPerDay + ptime.Time;
  end;

  edit2.Text := IntToStr(ptime.date * MSecsPerDay + ptime.Time);

  itmp1 := StrToInt(edit2.Text);  //msec

  itmp1 := Trunc(itmp1/1000);


  tmp1 := itmp1 div 86400; //day

  tmp2 := itmp1 mod 86400;

  tmp3 := tmp2 div 3600;  //HH

  tmp4 := tmp2 mod 3600;

  tmp5 := tmp4 div 60;  //NN

  tmp6 := tmp4 mod 60;   //ss

  edit3.Text := IntToStr(tmp1)+'일'+IntToStr(tmp3)+'시간'+IntToStr(tmp5)+'분'+ IntToStr(tmp6)+'초';



end;


두 날짜 뺀후 결과 msec 출력.


해당 msec를 날짜 시간 분 초로 구분...

원문1 : http://newworlds.tistory.com/618

원문2 : http://bloodguy.tistory.com/entry/PHP-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%B4%88%EB%A1%9C-%ED%99%98%EC%82%B0-%EC%B4%88%EB%A5%BC-%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C-%ED%99%98%EC%82%B0



Posted by theF
|



꽤 뒤늦게 윈도우7을 사용하게 되었는데,(그것도 HOME 버젼 ㅜㅜ)

뭐이리 복잡한지...쯧.


델파이 설치하는데 프로그램폴더가 뭔가 애매해서 D:\Borland 폴더에 설치했다.

그리고 실행하니 호환안된다는 겁주는 메시지 출력!!


무시하고 실행!!


잘된다...  ^^;


든데, Ctrl+Alt+F11 키가 안먹는다...   노트북 기능키 문제라 생각되어지는데, 해결책을 찾아 봐야지...


또하나. 도움말 표시가 되지 않는다.


그래서 검색했더니


"윈도우7에는 Winhelp32.exe가 없습니다. 요걸 깔아줘야 합니다.


http://www.microsoft.com/downloads/en/details.aspx?FamilyID=258aa5ec-e3d9-4228-8844-008e02b32a2c 에서 업데이트를 하시면 정상적으로 보이게 됩니다.
"

요래 친절한 답변이 2010년에 올라왔구나..
아~~난 정말 구닥다리에서 노나 보다... ㅜㅜ

근데, 원문님은 기본 폴더에 설치 하셨나 보다. 도움말 파일을 XP에서 복사 붙이기 하신걸 보니.

난 폴더를 따로 빼놔서 그런지 도움말 파일은 다 있었다.
그래서 원문님의 Winhelp32 파일만 다운받아서 다시 f1키 실행하니 잘 된다.





원문 : 

윈도우7에서 델파이7을 설치하고 도움말 동작이 안될경우 해결방법




Posted by theF
|

..

function MyExitWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        Windows.AdjustTokenPrivileges(TTokenHd,
                                      False,
                                      TTokenPvg,
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;


// Parameters for MyExitWindows()

출처 : 한국 델파이 개발자 동호회

http://www.delphi.co.kr/?document_srl=157263&act=trackback&key=d5f

Posted by theF
|
 PLC 측에서 PC로  1워드로 전송되는 데이타의 음수/ 양수 구분은 다음과 같이 구분됩니다.

        HEX 값 : 0        ∼ 7FFF  => 양수  (  십진수 :  0 ∼ 32767 )

        HEX 값 : 8000 ∼ FFFF  => 음수  (  십진수 :  32768 ∼ 65535 )  
                                           => PLC  Mointoring  DATA ( -32768 ∼ -1 )

       PLC측의 데이타를 PC에 표시하기 위해서는

     1)   전송되어진 데이타 ( EX) D1 => 16진수) 를 십진수로 전환 하시고 
     2)   십진수로 전환된 데이타값이 32767을 넘는지 아니지를 비교하여 

          0         <    전송데이타의 십진수  <=  32767   :  +
          327698 <=  전송데이타의 십진수  <   65535   :  -
   
          ※ 각각의 기호는 별도의 변수에 저장할것
             
    3)   0  <    전송데이타의 십진수  <=  32767   :  +   => 일 경우 

          전송데이타를 그대로 표시하시고 

    4)   327698 <=  전송데이타의 십진수  <   65535   :  -  => 일경우 

          표시할 데이타  = ( 65535 (FFFF)  - 전송데이타의 십진수 ) + 1 

          => 표시할데이타  앞에 "-" 를 붙인다. ( "-" + 표시할데이타 )

    5)  PC --> PLC로의 전송은 4번의 반대로 하시면 될것 같은데요.

출처 : http://blog.naver.com/yps10th?Redirect=Log&logNo=100033730657





PLC 의 데이터 레지스터에 있는 16진수 값을 PC(VB6.0)로 가져와서

정수로 표현할려고 하는데요 근데 음수도 표현해야 합니다.

양수 음수 표현하기 위해 어떤 방법을 써야 하는지 궁금합니다.


예)
16진수의 데이터(2 바이트) 에 대해서 정수 표현을 할려고 합니다.

그냥 십진수 표현은 Cdec("H&" & 16진수 데이터) 하면 출력이 되는데

음수 표현은 예를 들어 FF9C 같은 16진수는 정수(음수)로 표현하면 

-100이 되어야 합니다.

저 -100은 FFFF - FF9C 를 하면 양수 99가 나오는데 여기에 +1 을하고

(2의 보수와 동일 방법이라 생각이 들어서)

앞에 "-" 문자를 붙여 표시하고 있는데. 

어디서 부터 음수 표현을 해야 할지르 모르겠습니다.

처음에는 FFFF 값이 65535 라 Int 형의 최대 값인 32767 이 넘으면

음수표현하니 정확한 음수 값이 안나와서 현재 16진수 데이터 중 젤 앞자리가 F 이면

"-" & FFFF - 16진수 데이터 + 1 이런식으로 처리하고 있습니다.

궁금한것은 16진수 데이터가 얼마부터 음수로 표현하면 되는지 알려주시면

감사하겠습니다.



LS산전 사이트를 방문해 주셔서 감사합니다.
문의하신 내용에 대한 답변입니다.

문의 주신 내용에 대해서 16진수 1워드의 데이터 계산을 
위해서는 데이터 표시형식을 2가지로 할 수 있습니다.
먼저 Unsigned로 할 경우 데이터 표현이 0~65535로 표시가 됩니다.
이와는 반대로 signed로 할 경우에는 데이터 표현이 -32767~32768까지 표시가 됩니다.
그럼 32768이 넘어서게 되면 -부호로 표시가 되는데 16진수에서 32768이 넘어서게 되는
데이터의 경우 H8000을 넘어서게 되면 음수로 표시가 되게 됩니다.
그렇기 때문에 HEX코드에서 H7FFF까지가 양수가 되고 그 이상일 경우 
음수로 표현됩니다.
확인하여 보시고 문의 사항이 있으시면 문의 주시기 바랍니다.
감사합니다. 좋은 하루 되십시오.



GetValue := PLC 워드 데이터;
if GetValue > 32767 then begin
  GetValue := -(65537 - GetValue - 1) ;
end;
요래 함 되나?
Posted by theF
|

re] 비트통신법을 알려주세요...ㅡ..ㅡ 
 

안녕하셔요...

음..통신이 시리얼(rs232) 이죠..

그렇다면 비트 또는 니블 통신이라는 것도 결국 바이트 통신과 같습니다.

다만 바이트는 상대편이 한 바이트를 가지고 하나의 정보를 가지는것이고

비트는 한바이트를 가지고 8개의 각각 다른 정보를 가지는것이고

니블은 한바이트를 가지고 2개의 각각 다른 정보를 가지는 것이랍니다.

그럼..예를 들어 볼까요...

1. 비트 통신

비트는 주로 DI,DO등의 접점에 많이 쓰이죠..

한바이트 가지고 8개의 DI,DO를 제어할수 있어닌깐 통신량이 그만큼 줄어들겠죠..

예를 들어 8개의 램프가 있고 이걸 켜고 싶다면(비트로 매핑되어 있을 경우)

실제 데이터는 한바이트만 쓰여지죠..

const 
  BitFieldOn : array[1..8] of Byte = ($01,$02,$04,$08,$10,$20,$40,$80); 
  BitFieldOff : array[1..8] of Byte = ($FE,$FD,$FB,$F7,$EF,$DF,$BF,$7F);

var 
  senddata : Byte;

  senddata := 0; //데이터 초기화

  //1번,7번을 켜고 싶을 경우 
  senddata = senddata or BitFieldOn[1]; 
  senddata = senddata or BitFieldOn[7];

  //전송 
  comport.writechar(senddata);

  //7번을 끄고 싶을 경우 
  senddata = senddata and BitFieldOff[7]; 
  //전송 
  comport.writechar(senddata);

또는 귀찮어시면 다음 함수를 사용하셔도 됩니당.

// 주어진 바이트에서 원하는 비트를 끄잡어 내기.. 
function GetBitFromByte(B : Byte; Count: Integer) : Boolean; 
begin 
  Case Count of 
    0: Result := Boolean((B and $80) shr 7); 
    1: Result := Boolean((B and $40) shr 6); 
    2: Result := Boolean((B and $20) shr 5); 
    3: Result := Boolean((B and $10) shr 4); 
    4: Result := Boolean((B and $08) shr 3); 
    5: Result := Boolean((B and $04) shr 2); 
    6: Result := Boolean((B and $02) shr 1); 
    7: Result := Boolean(B and $01); 
  else 
    Result := True; 
  end; 
end;

// 주어진 바이트에 원하는 비트를 셋팅하기.. 
procedure SetBitToByte(var B : Byte; Count: Integer; Value: Boolean); 
begin 
  Case Count of 
    0: if Value then B := B or $80 else B := B and $7F; 
    1: if Value then B := B or $40 else B := B and $BF; 
    2: if Value then B := B or $20 else B := B and $DF; 
    3: if Value then B := B or $10 else B := B and $EF; 
    4: if Value then B := B or $08 else B := B and $F7; 
    5: if Value then B := B or $04 else B := B and $FB; 
    6: if Value then B := B or $02 else B := B and $FD; 
    7: if Value then B := B or $01 else B := B and $FE; 
  end; 
end;

2. 니블 통신

니블은 주로 카운터를 표시할때 많이 쓰이죠..

예를 들어 자동차 키로수처럼 카운터 메터를 표시할경우 한바이트로 두개의 영역을

표시할수 있어닌깐 이또한 통신 데이터를 줄일수 있겠죠..

예를 들어 9999를 표시한다면 두바이트면 되겠죠..

var 
  aa,bb : Byte; 
begin 
  aa := 0; 
  bb := 0;

  //1234를 전송할 경우 
  aa := ($01 shl 4) or $02; 
  bb := ($03 shl 4) or $04;

  comport.writechar(aa); 
  comport.writechar(bb); 
end;

휴~ 이상 입니당.

그럼..즐거운 주말 되시구요..항상 건강하셔요..

>장비가 10년전거라그러는데요, 지금도 사용잘하고 있답니다. 
>그당시 플을 업그레이드 하면서 제가 델로 하니까 델로 업을 하려는데요 
>비트통신이 되야되거든요... 
>이중에서도 두가지 입니다. 한종류는 비트통신 또하나는 4bit를 한 값으로 
>이용하는 니블통신이요. 
>이자 겨우 바이트 통신을 알게 된지 얼마 안되었는데 
>비트 통신을 하게 되었답니다.. 
>단, 4비트의(니블값) 최고값이 9를 넘지는 않더군요...즉 0 에서 9까지만여 

>지금 고민중이긴 한데 될듯될듯 안되네요...ㅜ..ㅜ 

>예제나 샘플이나 know-where등등 많이 많이 알려주시와요... 
>언릉 끝내야 하거든요.... 

>감사합니다.... 

Posted by theF
|