2026-06-05 13:44:39 +09:00

148 lines
8.8 KiB
C#

/****************************************************************************
*****************************************************************************
**
** File Name
** ---------
**
** AXS.CS
**
** COPYRIGHT (c) AJINEXTEK Co., LTD
**
*****************************************************************************
*****************************************************************************
**
** Description
** -----------
** Ajinextek Motion Library Header File
**
**
*****************************************************************************
*****************************************************************************
**
** Source Change IndicesAxmStatusGetCmdPos
** ---------------------
**
** (None)
**
*****************************************************************************
*****************************************************************************
**
** Website
** ---------------------
**
** http://www.ajinextek.com
**
*****************************************************************************
*****************************************************************************
*/
using System;
using System.Runtime.InteropServices;
public class CAXS
{
//========== 보드 및 모듈 확인함수(Info) - Infomation ===============================================================
// 해당 축의 보드번호, 모듈 위치, 모듈 아이디를 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoGetPort(int nAxisNo, ref int npBoardNo, ref int npModulePos, ref uint upModuleID);
//지정한 모듈 번호로 해당 모듈의 Sub ID, 모듈 Name, 모듈 설명을 확인한다.
//======================================================/
// 지원 제품 : EtherCAT
// upModuleSubID : EtherCAT 모듈을 구분하기 위한 SubID
// szModuleName : 모듈의 모델명(up to 50 Byte)
// szModuleDescription : 모듈에 대한 설명(up to 80 Byte)
//======================================================//
[DllImport("AXL.dll")] public static extern uint AxsInfoGetPortEx(int nPortNo, ref uint upModuleSubID, System.Text.StringBuilder szModuleName, System.Text.StringBuilder szModuleDescription);
// 모션 모듈이 존재하는지 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoIsSerialModule(ref uint upStatus);
// 해당 포트가 유효한지 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoIsInvalidPortNo(int nPortNo);
// 해당 포트가 제어가 가능한 상태인지 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoGetPortStatus(int nPortNo);
// 시스템내 유효한 통신포트수를 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoGetPortCount(ref int npPortCount);
// 해당 보드/모듈의 첫번째 축번호를 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoGetFirstPortNo(int nBoardNo, int nModulePos, ref int npPortNo);
// 해당 보드의 첫번째 통신포트번호를 반환한다.
[DllImport("AXL.dll")] public static extern uint AxsInfoGetBoardFirstPortNo(int nBoardNo, int nModulePos, ref int lpPortNo);
//========== 시리얼 통신함수(Port) =================================================================================
// 통신포트를 Open한다. PortOpen은 하나의 응용프로그램에서만 할 수 있음.
// lBaudRate : 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
// lDataBits : 7, 8
// lStopBits : 1, 2
// lParity : [0]None, [1]Even, [2]Odd
// dwFlagsAndAttributes : Reserved
[DllImport("AXL.dll")] public static extern uint AxsPortOpen(int nPortNo, int nBaudRate, int nDataBits, int nStopBits, int nParity, uint dwFlagsAndAttributes);
// 통신포트를 Close한다.
[DllImport("AXL.dll")] public static extern uint AxsPortClose(int nPortNo);
// 통신포트를 설정한다.(통신 버퍼는 초기화되지 않음)
// lpDCB->BaudRate : 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
// lpDCB->ByteSize : 7, 8
// lpDCB->StopBits : 1, 2
// lpDCB->Parity : [0]None, [1]Even, [2]Odd
[DllImport("kernel32.dll")] public static extern uint AxsPortSetCommState(int nPortNo, ref DCB lpDCB);
// 통신포트의 설정값을 확인한다.
[DllImport("kernel32.dll")] public static extern uint AxsPortGetCommState(int nPortNo, ref DCB lpDCB);
// 통신포트의 타임아웃값을 설정한다.
// lpCommTimeouts->ReadIntervalTimeout : 문자열 입력이 시작된 후 문자열간 Timeout 시간 설정(milliseconds)
// lpCommTimeouts->ReadTotalTimeoutMultiplier; : 읽기 동작시 설정한 통신속도에서 하나의 문자열에 대한 Timeout시간 설정(milliseconds)
// lpCommTimeouts->ReadTotalTimeoutConstant; : 입력받을 문자수에 대한 Timeout을 제외한 Timeout시간 설정(milliseconds)
// lpCommTimeouts->WriteTotalTimeoutMultiplier; : 쓰기 동작시 설정한 통신속도에서 하나의 문자열에 대한 Timeout시간 설정(milliseconds)
// lpCommTimeouts->WriteTotalTimeoutConstant; : 전송할 문자수에 대한 Timeout을 제외한 Timeout시간 설정(milliseconds)
[DllImport("kernel32.dll")] public static extern uint AxsPortSetCommTimeouts(int nPortNo, ref COMMTIMEOUTS lpCommTimeouts);
// 통신포트의 타임아웃값을 확인한다.
[DllImport("kernel32.dll")] public static extern uint AxsPortGetCommTimeouts(int nPortNo, ref COMMTIMEOUTS lpCommTimeouts);
// 장치의 오류 Flag를 지우거나 송수신된 데이타의 갯수를 확인한다.
// lpErrors :
// [1]CE_RXOVER: 수신버퍼 Overflow 발생
// [2]CE_OVERRUN: 수신버퍼 Overrun 에러발생
// [4]CE_RXPARITY: 수신 데이타 패리티비트 에러발생
// [8]CE_FRAME: 수신 Framing 에러발생
// lpStat->cbInQue : 수신버퍼에 입력된 데이타 갯수
// lpStat->cbOutQue: 송신버퍼에 남은 데이타 갯수
[DllImport("kernel32.dll")] public static extern uint AxsPortClearCommError(int nPortNo, out uint lpErrors, ref COMSTAT lpStat);
// 데이타 송신을 멈춤
[DllImport("AXL.dll")] public static extern uint AxsPortSetCommBreak(int nPortNo);
// 데이타 송신을 재개
[DllImport("AXL.dll")] public static extern uint AxsPortClearCommBreak(int nPortNo);
// 송수신을 정지하거나 버퍼를 지움
// dwFlags:
// [1]PURGE_TXABORT: 쓰기 작업을 정지함
// [2]PURGE_RXABORT: 읽기 작업을 정지함
// [4]PURGE_TXCLEAR: 송신 버퍼에 데이타가 있을경우 지움
// [8]PURGE_RXCLEAR: 수신 버퍼에 데이타가 있을경우 지움
[DllImport("AXL.dll")] public static extern uint AxsPortPurgeComm(int nPortNo, uint dwFlags);
// 시리얼 포트에 데이타를 씀
// lpBuffer : 장치에 쓸 데이터를 담는 버퍼의 포인트값
// nNumberOfBytesToWrite : lpBuffer에 담긴 실제 데이터의 바이트 수
// lpNumberOfBytesWritten : 실제로 쓰여진 바이트 수를 반환(None Overrapped 일경우)
// lpOverlapped : 비동기를 위한 OVERLAPPED 구조체의 포인트 값
[DllImport("kernel32.dll")] public static extern uint AxsPortWriteFile(int nPortNo, IntPtr lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, ref OVERLAPPED lpOverlapped);
// 시리얼 포트의 데이타를 읽음
// lpBuffer : 장치에 쓸 데이터를 담는 버퍼의 포인트값
// nNumberOfBytesToRead : lpBuffer가 가리키는 버퍼의 크기를 바이트로 지정
// lpNumberOfBytesRead : 실제로 읽혀진 바이트 수를 반환(None Overrapped 일경우)
// lpOverlapped : 비동기를 위한 OVERLAPPED 구조체의 포인트 값
[DllImport("kernel32.dll")] public static extern uint AxsPortReadFile(int nPortNo, IntPtr lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, ref OVERLAPPED lpOverlapped);
// 시리얼 포트의 Overlapped 작업의 결과에 대해 반환
// lpOverlapped->hEvent : 전송이 완료된 후 시그널될 이벤트 핸들. AxsPortWriteFile, AxsPortReadFile 함수를 사용하기전에 이 값을 설정함.
// lpNumberOfBytesTransferred: 실제 전송이 완료된 바이트 크기를 얻기 위한 변수포인트
// bWait: I/O 연산이 끝나지않은 상황에서의 처리를 결정
// [0]: I/O연산이 끝날때까지 기다림
// [1]: I/O연산이 끝나지 않아도 반환함
[DllImport("AXL.dll")] public static extern uint AxsPortGetOverlappedResult(int nPortNo, ref OVERLAPPED lpOverlapped, out uint lpNumberOfBytesTransferred, bool bWait);
// 시리얼 포트에 발생한 최종 에러코드를 반환
// [ 0]ERROR_SUCCESS 에러없음
// [ 5]ERROR_ACCESS_DENIED 통신포트가 사용중일 경우
// [ 6]ERROR_INVALID_HANDLE 통신포트가 유효하지 않을 경우(네트워크 연결오류포함)
// [ 87]ERROR_INVALID_PARAMETER 잘못된 파라메타 설정
// [995]ERROR_OPERATION_ABORTED The I/O operation has been aborted because of either a thread exit or an application request.
// [996]ERROR_IO_INCOMPLETE Overrapped모드일 때 쓰기작업이 끝나지 않은경우나 Timeout이 발생한 경우
// [997]ERROR_IO_PENDING Overrapped모드일 때 I/O작업이 진행중인 경우
// [998]ERROR_NOACCESS
[DllImport("AXL.dll")] public static extern uint AxsPortGetLastError(int nPortNo, ref uint dwpErrCode);
[DllImport("AXL.dll")] public static extern uint AxsPortSetLastError(int nPortNo, uint dwErrCode);
}