diff --git a/CAN_Terminal.dcu b/CAN_Terminal.dcu new file mode 100644 index 0000000..c8d03e4 Binary files /dev/null and b/CAN_Terminal.dcu differ diff --git a/CAN_Terminal.ddp b/CAN_Terminal.ddp new file mode 100644 index 0000000..4370276 Binary files /dev/null and b/CAN_Terminal.ddp differ diff --git a/CAN_Terminal.dfm b/CAN_Terminal.dfm new file mode 100644 index 0000000..666824c --- /dev/null +++ b/CAN_Terminal.dfm @@ -0,0 +1,345 @@ +object CANTerminal: TCANTerminal + Left = 992 + Top = 100 + Width = 801 + Height = 538 + Caption = 'CANTerminal "Hunderitter" v.07.04.2025' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010001002020100000000000E80200001600000028000000200000004000 + 0000010004000000000080020000000000000000000000000000000000000000 + 000000008000008000000080800080000000800080008080000080808000C0C0 + C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000077788F000000087FF0008000000000 + 0077788F000000087FF000800000000000000000FFFFFFF00000778F00000000 + 00000000FFFFFFF00000778F000000000000FFFFFFFFFFFFF000778F00000000 + 0000FFFFFFFFFFFFF000778F000000000000FFFFFFFFFFFFF000778F00000000 + 00000FFFF000FFFF0000778F0000000000000FFFF000FFFF0000778F00000000 + 08FF000FF000FFF00000778F0000000008FF000FF000FFF00000778F00000000 + 78FF000000000000000BBB9BBB00000078FF000000000000000BBB9BBB000077 + 8F00000FF000FFF00007BBBF000000778F00000FF000FFF00007BBBF00000000 + 78FF0FFF00000FFF077888000000000078FF0FFF00000FFF0778880000000000 + 0888FFFFFFFFFFFF7888FF00000000000888FFFFFFFFFFFF7888FF0000000000 + 00778FFFFFFFFFFF888000000000000000778FF00000000F8880000000000000 + 00778F0077788F0088800000000000000000000777788FF00000000000000000 + 0000000777788FF000000000000000000000000770088FF00000000000000000 + 0000000770088FF0000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FFFFF80780CFF80780CFF800000FF800000FFC000003FC000003FC000003FC00 + 0003FC000003F8000603F8000603F0000003F0000003C0600E01C0600E018080 + 000380800003C000000FC000000FF000001FF000001FF80000FFF80000FFF800 + 00FFFC0001FFFC0001FFFF800FFFFF800FFFFF800FFFFF800FFFFFFFFFFF} + OldCreateOrder = False + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object RxLabel1: TRxLabel + Left = 245 + Top = 440 + Width = 39 + Height = 13 + Caption = 'CAN on' + end + object ProjectBox: TComboBox + Left = 10 + Top = 20 + Width = 150 + Height = 21 + ItemHeight = 13 + TabOrder = 0 + Text = 'ProjectBox' + OnChange = ProjectBoxChange + Items.Strings = ( + '+ + Add project + +') + end + object GroupBox: TGroupBox + Left = 10 + Top = 48 + Width = 765 + Height = 337 + Caption = ' '#1055#1088#1086#1077#1082#1090' ' + TabOrder = 1 + object Label1: TLabel + Left = 32 + Top = 40 + Width = 15 + Height = 13 + Caption = 'RS' + end + object Label2: TLabel + Left = 104 + Top = 48 + Width = 60 + Height = 13 + Caption = #1059#1089#1090#1088#1086#1081#1089#1090#1074#1086 + end + object Label3: TLabel + Left = 176 + Top = 64 + Width = 67 + Height = 13 + Caption = #1055#1088#1080#1077#1084' <-- '#1057#1059 + end + object Label4: TLabel + Left = 248 + Top = 72 + Width = 82 + Height = 13 + Caption = #1055#1077#1088#1077#1076#1072#1095#1072' --> '#1057#1059 + end + object Label5: TLabel + Left = 328 + Top = 80 + Width = 14 + Height = 13 + Caption = 'Go' + end + object Label6: TLabel + Left = 48 + Top = 152 + Width = 15 + Height = 13 + Caption = 'RS' + end + object Label7: TLabel + Left = 136 + Top = 184 + Width = 60 + Height = 13 + Caption = #1059#1089#1090#1088#1086#1081#1089#1090#1074#1086 + end + object Label8: TLabel + Left = 240 + Top = 208 + Width = 67 + Height = 13 + Caption = #1055#1088#1080#1077#1084' <-- '#1057#1059 + end + object Label9: TLabel + Left = 352 + Top = 232 + Width = 82 + Height = 13 + Caption = #1055#1077#1088#1077#1076#1072#1095#1072' --> '#1057#1059 + end + object Label10: TLabel + Left = 456 + Top = 248 + Width = 14 + Height = 13 + Caption = 'Go' + end + end + object Memo1: TMemo + Left = 10 + Top = 390 + Width = 225 + Height = 100 + Lines.Strings = ( + '') + TabOrder = 2 + end + object CANswitch: TRxSwitch + Left = 248 + Top = 390 + Width = 33 + Height = 49 + Caption = 'CANswitch' + TabOrder = 3 + OnClick = CANswitchClick + end + object GroupBox1: TGroupBox + Left = 472 + Top = 400 + Width = 273 + Height = 169 + Caption = 'UART' + TabOrder = 4 + Visible = False + object RxLabel2: TRxLabel + Left = 24 + Top = 18 + Width = 31 + Height = 13 + Caption = 'Com:' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object RxLabel6: TRxLabel + Left = 81 + Top = 148 + Width = 56 + Height = 13 + Caption = 'TimeWait' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + end + object AbortKey: TSpeedButton + Left = 8 + Top = 80 + Width = 17 + Height = 17 + Glyph.Data = { + 76010000424D7601000000000000760000002800000020000000100000000100 + 04000000000000010000130B0000130B00001000000000000000000000000000 + 800000800000008080008000000080008000808000007F7F7F00BFBFBF000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333333333 + 3333333333FFFFF3333333333999993333333333F77777FFF333333999999999 + 33333337777FF377FF3333993370739993333377FF373F377FF3399993000339 + 993337777F777F3377F3393999707333993337F77737333337FF993399933333 + 399377F3777FF333377F993339903333399377F33737FF33377F993333707333 + 399377F333377FF3377F993333101933399377F333777FFF377F993333000993 + 399377FF3377737FF7733993330009993933373FF3777377F7F3399933000399 + 99333773FF777F777733339993707339933333773FF7FFF77333333999999999 + 3333333777333777333333333999993333333333377777333333} + NumGlyphs = 2 + Visible = False + end + object CBLockRS: TCheckBox + Left = 32 + Top = 46 + Width = 73 + Height = 17 + Caption = 'LockRS' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'MS Sans Serif' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + OnClick = CBLockRSClick + end + object RCom: TRxSpinEdit + Left = 64 + Top = 16 + Width = 41 + Height = 21 + MaxValue = 255.000000000000000000 + Value = 1.000000000000000000 + TabOrder = 1 + OnChange = RComChange + end + object RGBaud: TRadioGroup + Left = 120 + Top = 16 + Width = 73 + Height = 57 + BiDiMode = bdLeftToRight + Caption = 'Baud' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -9 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ItemIndex = 1 + Items.Strings = ( + '57600' + '115200') + ParentBiDiMode = False + ParentFont = False + TabOrder = 2 + OnClick = RGBaudClick + end + object TimeWait: TRxSpinEdit + Left = 10 + Top = 140 + Width = 55 + Height = 21 + Value = 10.000000000000000000 + TabOrder = 3 + end + object PBRs: TProgressBar + Left = 40 + Top = 80 + Width = 73 + Height = 17 + Step = 2 + TabOrder = 4 + end + object Memo2: TMemo + Left = 162 + Top = 88 + Width = 167 + Height = 73 + Font.Charset = RUSSIAN_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Courier' + Font.Style = [fsBold] + ParentFont = False + TabOrder = 5 + OnChange = Memo2Change + end + end + object RadioGroup1: TRadioGroup + Left = 296 + Top = 390 + Width = 73 + Height = 65 + Caption = ' Can Speed ' + TabOrder = 5 + end + object Button125: TRadioButton + Left = 304 + Top = 408 + Width = 50 + Height = 17 + Caption = '125K' + TabOrder = 6 + end + object Button250: TRadioButton + Left = 304 + Top = 432 + Width = 50 + Height = 17 + Caption = '250K' + Checked = True + TabOrder = 7 + TabStop = True + end + object CanTimer: TTimer + Interval = 10 + OnTimer = CanTimerTimer + Left = 744 + Top = 8 + end + object MyCommPort: TApdComPort + ComNumber = 1 + Baud = 115200 + PromptForPort = False + StopBits = 2 + InSize = 65500 + OutSize = 65000 + AutoOpen = False + DTR = False + BufferFull = 58500 + BufferResume = 5850 + TraceSize = 4000000 + TraceName = 'e:\APRO.TRC' + TraceHex = False + LogSize = 4000000 + LogName = 'e:\APRO.LOG' + LogHex = False + UseEventWord = False + CommNotificationLevel = 1 + TapiMode = tmNone + Left = 696 + Top = 8 + end +end diff --git a/CAN_Terminal.pas b/CAN_Terminal.pas new file mode 100644 index 0000000..d62df46 --- /dev/null +++ b/CAN_Terminal.pas @@ -0,0 +1,687 @@ +unit CAN_Terminal; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, ExtCtrls, StdCtrls, IniFiles, UNiiefa, ToolsCan, RXSwitch, + ComCtrls, Buttons, OoMisc, AdPort, Mask, RXSpin, RXCtrls; + +type + + TCANTerminal = class(TForm) + ProjectBox: TComboBox; + GroupBox: TGroupBox; + Label1: TLabel; + Label2: TLabel; + Label3: TLabel; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + Label7: TLabel; + Label8: TLabel; + Label9: TLabel; + Label10: TLabel; + CanTimer: TTimer; + Memo1: TMemo; + CANswitch: TRxSwitch; + GroupBox1: TGroupBox; + CBLockRS: TCheckBox; + RxLabel2: TRxLabel; + RCom: TRxSpinEdit; + RGBaud: TRadioGroup; + MyCommPort: TApdComPort; + RxLabel6: TRxLabel; + TimeWait: TRxSpinEdit; + AbortKey: TSpeedButton; + PBRs: TProgressBar; + Memo2: TMemo; + RadioGroup1: TRadioGroup; + Button125: TRadioButton; + Button250: TRadioButton; + RxLabel1: TRxLabel; + + procedure FormCreate(Sender: TObject); + + procedure LoadProjectAdres(ProjID: string); + + procedure ShowProjectAdres(); + procedure ShoWinClick(Sender: TObject); + procedure CanTimerTimer(Sender: TObject); + procedure CANswitchClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure RGBaudClick(Sender: TObject); + procedure RComChange(Sender: TObject); + procedure CBLockRSClick(Sender: TObject); + procedure Memo2Change(Sender: TObject); + procedure ProjectBoxChange(Sender: TObject); + + private + { Private declarations } + + public + + { Public declarations } + end; + + + TBar = record + RSadr: TPanel; + RXadr: TPanel; + TXadr: TPanel; + Name: TPanel; + Go: TButton; + end; + + TUKSS = record + Bar: TBar; + RSadr: cardinal; + RXadr: longword; + TXadr: longword; + Use: boolean; + Exist: boolean; + Name: string; + Wind: TModbusForm; + end; + + TBars = record + BaseAdr: TPanel; + CommAdr: TPanel; + Name: TPanel; + end; + + TProject = record + Bars: TBars; + BaseAdr: longword; + PlusAdr: integer; + CommAdr: longword; + UKSS: array[0..15] of TUKSS; + Name: string; + DigiButNames: array[0..16] of string; + DigiButNameChange: boolean; + Protokol: integer; + end; + + Tbox = record + adr: longword; + qua: cardinal; + end; + + Tboxx = record + box : array[1..100] of Tbox; // edit boxlen! + qua: cardinal; + end; + + var + CANTerminal: TCANTerminal; + Project : TProject; + + + PathExe : String; + + ProjectQua : integer = 0; + ProjectNum : integer = 0; + + + Boxx : Tboxx; + + const + boxlen = 100; + +implementation + + +{$R *.dfm} + +procedure TCANTerminal.FormCreate(Sender: TObject); +var i: integer; + inifile : TIniFile; + nom,num: string; + wid,hei,tab,lef,top,lev : integer; + +begin + + InitSlavnaDll(); + + Project.Bars.Name := TPanel.Create(self); + Project.Bars.Name.Parent := GroupBox; + Project.Bars.Name.Left :=10; + Project.Bars.Name.Top :=15; + Project.Bars.Name.Width :=100; + Project.Bars.Name.Height := 30; + + Project.Bars.BaseAdr := TPanel.Create(self); + Project.Bars.BaseAdr.Parent := GroupBox; + Project.Bars.BaseAdr.Left :=10+100+10; + Project.Bars.BaseAdr.Top :=15; + Project.Bars.BaseAdr.Width :=100; + Project.Bars.BaseAdr.Height := 30; + + Project.Bars.CommAdr := TPanel.Create(self); + Project.Bars.CommAdr.Parent := GroupBox; + Project.Bars.CommAdr.Left :=10+100+10+100+10; + Project.Bars.CommAdr.Top :=15; + Project.Bars.CommAdr.Width :=100; + Project.Bars.CommAdr.Height := 30; + + tab:=5; + + Label1.Top := Project.Bars.Name.Top + Project.Bars.Name.Height + tab*3; + Label2.Top := Label1.Top; Label3.Top := Label1.Top; Label4.Top := Label1.Top; + Label5.Top := Label1.Top; Label6.Top := Label1.Top; Label7.Top := Label1.Top; + Label8.Top := Label1.Top; Label9.Top := Label1.Top; Label10.Top := Label1.Top; + + for i:= 0 to 15 do + begin + + hei := 25; + top := Label1.Top + Label1.Height + tab + (hei+tab)*(i mod 8); + lef := 10 + (i div 8)*(lev); + + wid := hei; + Project.UKSS[i].Bar.RSadr := TPanel.Create(self); + Project.UKSS[i].Bar.RSadr.Parent := GroupBox; + Project.UKSS[i].Bar.RSadr.Width := wid; + Project.UKSS[i].Bar.RSadr.Height := hei; + Project.UKSS[i].Bar.RSadr.Left :=lef; + Project.UKSS[i].Bar.RSadr.Top :=top; + + if i=0 then Label1.Left := lef; + if i=8 then Label6.Left := lef; + + lef := lef + wid + tab; + wid := 110; + + Project.UKSS[i].Bar.Name := TPanel.Create(self); + Project.UKSS[i].Bar.Name.Parent := GroupBox; + Project.UKSS[i].Bar.Name.Width :=wid; + Project.UKSS[i].Bar.Name.Height := hei; + Project.UKSS[i].Bar.Name.Left :=lef; + Project.UKSS[i].Bar.Name.Top :=top; + + if i=0 then Label2.Left := lef; + if i=8 then Label7.Left := lef; + + lef := lef + wid + tab; + wid := 90; + + Project.UKSS[i].Bar.RXadr := TPanel.Create(self); + Project.UKSS[i].Bar.RXadr.Parent := GroupBox; + Project.UKSS[i].Bar.RXadr.Width :=wid; + Project.UKSS[i].Bar.RXadr.Height := hei; + Project.UKSS[i].Bar.RXadr.Left :=lef; + Project.UKSS[i].Bar.RXadr.Top :=top; + + if i=0 then Label3.Left := lef; + if i=8 then Label8.Left := lef; + + lef := lef + wid + tab; + wid := 90; + + Project.UKSS[i].Bar.TXadr := TPanel.Create(self); + Project.UKSS[i].Bar.TXadr.Parent := GroupBox; + Project.UKSS[i].Bar.TXadr.Width :=wid; + Project.UKSS[i].Bar.TXadr.Height := hei; + Project.UKSS[i].Bar.TXadr.Left :=lef; + Project.UKSS[i].Bar.TXadr.Top :=top; + + if i=0 then Label4.Left := lef; + if i=8 then Label9.Left := lef; + + lef := lef + wid + tab; + wid := hei; + + Project.UKSS[i].Bar.Go := TButton.Create(self); + Project.UKSS[i].Bar.Go.Parent := GroupBox; + Project.UKSS[i].Bar.Go.Width :=wid; + Project.UKSS[i].Bar.Go.Height := hei; + Project.UKSS[i].Bar.Go.Left :=lef; + Project.UKSS[i].Bar.Go.Top :=top; + Project.UKSS[i].Bar.Go.Caption :='S'; + Project.UKSS[i].Bar.Go.Font.Style:=[fsBold]; + Project.UKSS[i].Bar.Go.Tag := i; + Project.UKSS[i].Bar.Go.OnClick := ShoWinClick; + + if i=0 then Label5.Left := lef; + if i=8 then Label10.Left := lef; + + if i<8 then lev := lef + wid + tab*2; + + end; + + PathExe:=ExtractFileDir(ParamStr(0))+'\'; + + inifile := TIniFile.Create(PathExe+'Projects.ini'); + + ProjectQua := Inifile.ReadInteger('Projects','ProjectQua',0); + ProjectNum := Inifile.ReadInteger('Projects','ProjectNum',0); + + for i:=1 to ProjectQua do + begin + Num := 'Project'+inttostr(i); + Nom := Inifile.ReadString('Projects',Num,Num); + ProjectBox.Items.add(Nom); + end; + inifile.Free; + + Project.Name := ProjectBox.Items[ProjectNum]; + ProjectBox.ItemIndex := ProjectNum; + + ProjectBoxChange(Sender); + +end; + +procedure TCANTerminal.ShowProjectAdres(); +var + i: integer; +begin + Project.Bars.Name.Caption := Project.Name; + Project.Bars.BaseAdr.Caption := '0x'+inttohex(Project.BaseAdr,8); + if Project.CommAdr = 0 + then Project.Bars.CommAdr.Caption := '' + else Project.Bars.CommAdr.Caption := '0x'+inttohex(Project.CommAdr,8); + + for i:=0 to 15 do + begin + Project.UKSS[i].Bar.RXadr.Tag:=0; + Project.UKSS[i].Bar.TXadr.Tag:=0; + if Project.UKSS[i].Use then + begin + Project.UKSS[i].Bar.RSadr.Caption := inttostr(Project.UKSS[i].RSadr); + Project.UKSS[i].Bar.RXadr.Caption := '0x' + inttohex(Project.UKSS[i].RXadr,8); + Project.UKSS[i].Bar.TXadr.Caption := '0x' + inttohex(Project.UKSS[i].TXadr,8); + Project.UKSS[i].Bar.Name.Caption := Project.UKSS[i].Name; + Project.UKSS[i].Bar.Go.Caption := 'S'; + Project.UKSS[i].Bar.Go.Enabled:=true; + Project.UKSS[i].Bar.Name.Color:=clWindow; + Project.UKSS[i].Bar.RSadr.Color:=clWindow; + Project.UKSS[i].Bar.RXadr.Color := clWindow; + Project.UKSS[i].Bar.TXadr.Color := clWindow; + end else + begin + Project.UKSS[i].Bar.RSadr.Caption := ''; + Project.UKSS[i].Bar.RXadr.Caption := ''; + Project.UKSS[i].Bar.TXadr.Caption := ''; + Project.UKSS[i].Bar.Name.Caption := ''; + Project.UKSS[i].Bar.Go.Caption := ''; + Project.UKSS[i].Bar.Go.Enabled:=false; + Project.UKSS[i].Bar.Name.Color:=clBtnFace; + Project.UKSS[i].Bar.RSadr.Color:=clBtnFace; + Project.UKSS[i].Bar.RXadr.Color := clBtnFace; + Project.UKSS[i].Bar.TXadr.Color := clBtnFace; + end; + end; + +end; + + + + +procedure TCANTerminal.LoadProjectAdres(ProjID: string); +var i,adr: integer; + inifile : TIniFile; + nom,nym: string; + num: longword; + left: integer; +begin + inifile := TIniFile.Create(PathExe+'Projects.ini'); + + Project.Protokol := Inifile.ReadInteger(ProjID,'Protokol',0); + + if Project.Protokol = 3 then + begin + Project.BaseAdr := 0; + Project.PlusAdr := 1 shl 28; + left:=24; + end else begin + Project.BaseAdr := Inifile.ReadInteger(ProjID,'BaseAdr',0); + Project.PlusAdr := Inifile.ReadInteger(ProjID,'PlusAdr',16); + left:=0; + end; + + Project.CommAdr := Inifile.ReadInteger(ProjID,'CommAdr',0); + + adr:=-1; + for i:=0 to 15 do + begin + + nom := 'Use_'+inttostr(i); + Project.UKSS[i].Use := inifile.ReadBool(ProjID,nom,false); + + if Project.UKSS[i].Use then + begin + + nom := 'CANadr_'+inttostr(i); + adr := inifile.ReadInteger(ProjID,nom,adr+1); + + nom := 'RSadr_'+inttostr(i); + Project.UKSS[i].RSadr := inifile.ReadInteger(ProjID,nom,i); + + nom := 'TXadr_'+inttostr(i); + num := Project.BaseAdr+Project.PlusAdr+(adr shl left); + Project.UKSS[i].TXadr := inifile.ReadInteger(ProjID,nom,num); + + nom := 'RXadr_'+inttostr(i); + num := Project.BaseAdr+(adr shl left); + Project.UKSS[i].RXadr := inifile.ReadInteger(ProjID,nom,num); + + nom := 'Name_'+inttostr(i); + nym := 'UKSS_'+inttostr(i); + Project.UKSS[i].Name := inifile.ReadString(ProjID,nom,nym); + end; + end; + inifile.Free; + + ShowProjectAdres(); + +end; + +procedure TCANTerminal.ShoWinClick(Sender: TObject); +var + Tagg : integer; +begin + + Tagg:= (Sender as TButton).Tag; + + if not Project.UKSS[Tagg].Exist then + begin + Project.UKSS[Tagg].Wind := TModbusForm.Create(nil); + Project.UKSS[Tagg].Wind.Caption := Project.Name+': '+Project.UKSS[Tagg].Name; + Project.UKSS[Tagg].Wind.Numer:= Tagg; + Project.UKSS[Tagg].Wind.RSadr:= Project.UKSS[Tagg].RSadr; + Project.UKSS[Tagg].Wind.RXadr:= Project.UKSS[Tagg].RXadr; + Project.UKSS[Tagg].Wind.TXadr:= Project.UKSS[Tagg].TXadr; + Project.UKSS[Tagg].Wind.Protokol:= Project.Protokol; + Project.UKSS[Tagg].Exist := true; + end; + + Project.UKSS[Tagg].Wind.show; + +end; + +procedure TCANTerminal.CanTimerTimer(Sender: TObject); +var +i,j,pak, paks : integer; +newstring: string; +adr: longword; +Mess: Tmessag; + +begin + + paks :=ReadMessageCanID(CanTimer.Interval); + if paks > 0 then + begin + + for pak := 0 to paks-1 do + begin + + if Project.Protokol=3 + + then adr := ArrCanMessage[pak].m_dwID and $1F000000 + else adr := ArrCanMessage[pak].m_dwID; + + if boxx.qua = 0 then + begin + boxx.qua := 1; + boxx.box[1].qua := 1; + boxx.box[1].adr := adr; + end else + begin + + i:=0; + repeat i:=i+1 + until (boxx.box[i].adr = adr) or (i > boxx.qua); + + if i <= boxx.qua then + begin + boxx.box[i].qua := boxx.box[i].qua + 1; + if boxx.box[i].qua > 1000 then + begin + boxx.qua := 1; + boxx.box[1].qua := 1; + boxx.box[1].adr := adr; + end else + begin + if i > 1 then + begin + if boxx.box[i].qua > boxx.box[i-1].qua then + begin + boxx.box[i].adr := boxx.box[i-1].adr; + boxx.box[i-1].adr := adr; + boxx.box[i-1].qua := boxx.box[i].qua; + boxx.box[i].qua := boxx.box[i].qua-1; + end + end + end + end else + begin + if i > boxlen then + begin + boxx.qua := 1; + boxx.box[1].qua := 1; + boxx.box[1].adr := adr; + end else + begin + boxx.qua := i; + boxx.box[i].qua := 1; + boxx.box[i].adr := adr; + end + end + end; + + for i:=0 to 15 do + if Project.UKSS[i].Use then + begin + if Project.UKSS[i].RXadr = adr then + begin + Project.UKSS[i].Bar.RXadr.Color := $FFD0A0; //clMoneyGreen; + Project.UKSS[i].Bar.RXadr.Tag := 5000 div CANTimer.Interval; + end; + if Project.UKSS[i].TXadr = adr then + begin + Project.UKSS[i].Bar.TXadr.Color := $A0FFC0; //clMoneyGreen; + Project.UKSS[i].Bar.TXadr.Tag := 5000 div CANTimer.Interval; + end; + + if (Project.UKSS[i].RXadr = adr) + or (Project.UKSS[i].TXadr = adr) then + begin + + if project.Protokol = 3 then + begin + + mess.Leng := ArrCanMessage[pak].m_bDLC shr 1; + mess.Addr := ArrCanMessage[pak].m_dwID and $0000007F; + mess.Mask := $FF; + + mess.Data[0] := ArrCanMessage[pak].m_bData[1] shl 8; + mess.Data[0] := ArrCanMessage[pak].m_bData[2] or mess.Data[0]; + mess.Data[1] := ArrCanMessage[pak].m_bData[3] shl 8; + mess.Data[1] := ArrCanMessage[pak].m_bData[4] or mess.Data[1]; + mess.Data[2] := ArrCanMessage[pak].m_bData[5] shl 8; + mess.Data[2] := ArrCanMessage[pak].m_bData[6] or mess.Data[2]; + mess.Data[3] := ArrCanMessage[pak].m_bData[7] shl 8; + mess.Data[3] := ArrCanMessage[pak].m_bData[8] or mess.Data[3]; + + end else begin + + mess.Mask := ArrCanMessage[pak].m_bData[5] shr 5; + mess.Addr :=(ArrCanMessage[pak].m_bData[5] and $1F) shl 8; + mess.Addr := ArrCanMessage[pak].m_bData[6] or mess.Addr; + mess.Leng := 3; + + mess.Data[0] := ArrCanMessage[pak].m_bData[7] shl 8; + mess.Data[0] := ArrCanMessage[pak].m_bData[8] or mess.Data[0]; + mess.Data[1] := ArrCanMessage[pak].m_bData[1] shl 8; + mess.Data[1] := ArrCanMessage[pak].m_bData[2] or mess.Data[1]; + mess.Data[2] := ArrCanMessage[pak].m_bData[3] shl 8; + mess.Data[2] := ArrCanMessage[pak].m_bData[4] or mess.Data[2]; + + end; + + if(Project.UKSS[i].TXadr = adr) then mess.Surs := 0; + if(Project.UKSS[i].RXadr = adr) then mess.Surs := 1; + + if Project.UKSS[i].Exist then + Project.UKSS[i].Wind.ReceiveCanData(mess); + + end + end + end; + + newstring:=''; + for i:= 1 to boxx.qua do + + newstring:= newstring + + '0x'+ inttohex(boxx.box[i].adr,8) + + '(' + inttostr(boxx.box[i].qua) + ') '; + + Memo1.Clear; + Memo1.Lines[0] := newstring; + + end; + + if CANswitch.StateOn then + for i:=0 to 15 do + if Project.UKSS[i].Use then + begin + if Project.UKSS[i].Bar.RXadr.Tag = 0 + then Project.UKSS[i].Bar.RXadr.Color := clWindow + else + begin + Project.UKSS[i].Bar.RXadr.Tag := Project.UKSS[i].Bar.RXadr.Tag - 1; + if Project.UKSS[i].Bar.RXadr.Tag < 4000 div CANTimer.Interval + then Project.UKSS[i].Bar.RXadr.Color := $F0E0D0; + end; + + if Project.UKSS[i].Bar.TXadr.Tag = 0 + then Project.UKSS[i].Bar.TXadr.Color := clWindow + else + begin + Project.UKSS[i].Bar.TXadr.Tag := Project.UKSS[i].Bar.TXadr.Tag - 1; + if Project.UKSS[i].Bar.TXadr.Tag < 4000 div CANTimer.Interval + then Project.UKSS[i].Bar.TXadr.Color := $D0F0E0; + end + end; + +end; + + +procedure TCANTerminal.CANswitchClick(Sender: TObject); +var + i: integer; +begin + if CANswitch.StateOn then + begin + if Button125.Checked then OpenSlavna(1,8); + if Button250.Checked then OpenSlavna(2,8); + CanTimer.Enabled:=true; + end else + begin + CloseSlavna(); + CanTimer.Enabled:=false; + boxx.qua := 0; + for i:=0 to 15 do + begin + Project.UKSS[i].Bar.RXadr.Color := clBtnFace; + Project.UKSS[i].Bar.TXadr.Color := clBtnFace; + end; + end; +end; + +procedure TCANTerminal.FormClose(Sender: TObject; + var Action: TCloseAction); +var i: integer; + inifile : TIniFile; + nom: string; +begin + + if Project.DigiButNameChange then + begin + + inifile := TIniFile.Create(PathExe+'Projects.ini'); + + for i:=0 to 16 do + begin + nom := 'DigiBut_'+inttostr(i); + inifile.WriteString(Project.Name,nom,Project.DigiButNames[i]); + end; + + inifile.Free; + + end; + + CloseSlavna(); + FreeSlavnaDll(); +end; + +procedure TCANTerminal.RGBaudClick(Sender: TObject); +begin + if RGBaud.ItemIndex=0 then MyCommPort.Baud:=57600; + if RGBaud.ItemIndex=1 then MyCommPort.Baud:=115200; +end; + +procedure TCANTerminal.RComChange(Sender: TObject); +begin + MyCommPort.Open:=False; + MyCommPort.ComNumber:= Round(RCom.Value); +end; + +procedure TCANTerminal.CBLockRSClick(Sender: TObject); +begin + MyCommPort.Open := CBLockRS.Checked; +end; + +procedure TCANTerminal.Memo2Change(Sender: TObject); +begin + if Memo1.Lines.Count > 100 then Memo1.Clear; +end; + +procedure TCANTerminal.ProjectBoxChange(Sender: TObject); +var i : integer; + inifile : TIniFile; + nom, num: string; +begin + + for i:=0 to 15 do + if Project.UKSS[i].Exist then + begin + Project.UKSS[i].Wind.Close; + Project.UKSS[i].Exist:=false; + end; + + Project.Name := ProjectBox.Items[ProjectBox.ItemIndex]; + + if ProjectBox.ItemIndex >0 then + LoadProjectAdres(Project.Name); + + inifile := TIniFile.Create(PathExe+'Projects.ini'); + + nom:='ProjectNum'; + num:=inttostr(ProjectBox.ItemIndex); + + inifile.WriteString('Projects',nom,num); + + for i:=0 to 16 do + begin + num := 'DigiBut_'+inttostr(i); + Project.DigiButNames[i] := inifile.ReadString(Project.Name,num,'-'); + end; + Project.DigiButNameChange := false; + + inifile.Free; + + boxx.qua:=0; + for i:= 1 to 100 do + begin + boxx.box[i].adr:=0; + boxx.box[i].qua:=0; + end; + + + + + +end; + +end. diff --git a/Projects.ini b/Projects.ini new file mode 100644 index 0000000..f534346 --- /dev/null +++ b/Projects.ini @@ -0,0 +1,407 @@ +[Projects] +ProjectQua=9 +ProjectNum=6 +Project1=Буксир +Project2=СЭДБМ +Project3=Ледокол +Project4=Бальзам +Project5=23550 +Project6=23550.X +Project7=23550.2 +Project8=Янтарь +Project9=23550 БСУ + +[Буксир] +BaseAdr=$00318200 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +RSadr_0=1 +RSadr_1=2 +RSadr_2=3 +RSadr_3=4 +Name_0=УКСС СБ +Name_1=БКСС ГД +Name_2=УКСВЭП +Name_3=Задатчик +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Calcul +DigiBut_6=Secret +DigiBut_7=Light +DigiBut_8=Raw +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + + +[СЭДБМ] +BaseAdr=$1051020 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +Use_4=1 +Use_5=1 +Use_6=1 +Use_8=1 +Use_9=1 +Use_10=1 +Use_11=1 +Use_12=1 +Use_13=1 +Use_14=1 +Use_15=1 +CANadr_8=$20 +Name_0=УКСС СК1 СБ1 +Name_1=УКСС СК2 СБ1 +Name_2=УКСС СК3 СБ1 +Name_3=УКСС СК4 СБ1 +Name_4=УКССВЭП СБ1 +Name_5=Задатчик СБ1 +Name_6=БТР ИТЭС +Name_8=УКСС СК1 СБ2 +Name_9=УКСС СК2 СБ2 +Name_10=УКСС СК3 СБ2 +Name_11=УКСС СК4 СБ2 +Name_12=УКССВЭП СБ2 +Name_13=Задатчик СБ2 +Name_14=УКСС БОИН +Name_15=УКСВЭП БОИН +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Calcul +DigiBut_6=Secret +DigiBut_7=Raw +DigiBut_8=HiVolt +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[Ледокол] +BaseAdr=$01CE020 +PlusAdr=-$20 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +Use_4=1 +Use_5=1 +Use_8=1 +Use_9=1 +Use_10=1 +Use_11=1 +Use_12=1 +Use_13=1 + +CANadr_0=0 +CANadr_1=2 +CANadr_2=4 +CANadr_3=6 +CANadr_4=8 +CANadr_5=10 +CANadr_8=1 +CANadr_9=3 +CANadr_10=5 +CANadr_11=7 +CANadr_12=9 +CANadr_13=11 + +RSadr_0=1 +RSadr_1=3 +RSadr_2=5 +RSadr_3=7 +RSadr_4=9 +RSadr_5=11 +RSadr_8=2 +RSadr_9=4 +RSadr_10=6 +RSadr_11=8 +RSadr_12=10 +RSadr_13=12 + +Name_0=УКСС БВ1 ПЧ1 +Name_8=УКСС БВ1 ПЧ2 +Name_1=УКСС БВ1 ПЧ1 +Name_9=УКСС БВ2 ПЧ2 +Name_2=УКСС БИ1 ПЧ1 +Name_10=УКСС БИ1 ПЧ2 +Name_3=УКСС БИ2 ПЧ1 +Name_11=УКСС БИ2 ПЧ2 +Name_4=УКССВЭП1 ПЧ1 +Name_12=УКССВЭП1 ПЧ2 +Name_5=УКССВЭП2 ПЧ1 +Name_13=УКССВЭП2 ПЧ2 + +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Raw +DigiBut_5=Read +DigiBut_6=ExtLamp +DigiBut_7=ExtLite +DigiBut_8=No log +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[Бальзам] +BaseAdr=$0BA0000 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +Use_4=1 +Use_5=1 +Use_8=1 +Use_9=1 +Use_10=1 + +CANadr_0=0 +CANadr_1=2 +CANadr_2=4 +CANadr_3=6 +CANadr_4=7 +CANadr_5=8 +CANadr_8=1 +CANadr_9=3 +CANadr_10=5 + +RSadr_0=1 +RSadr_1=3 +RSadr_2=5 +RSadr_3=7 +RSadr_4=9 +RSadr_5=11 +RSadr_8=2 +RSadr_9=4 +RSadr_10=6 + +Name_0=БКСС Тр1 +Name_8=БКСС Тр2 +Name_1=УКСС СБ1 +Name_9=УКСС СБ2 +Name_2=УКСС УМП1 +Name_10=УКСС УМП2 +Name_3=БКСС ГД +Name_4=Задатчик +Name_5=УКСС ВЭП + +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Calcul +DigiBut_6=Stop +DigiBut_7=Start +DigiBut_8=Init +DigiBut_9=Tune +DigiBut_10=Secret +DigiBut_11=Light +DigiBut_12=Raw +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[23550] +BaseAdr=$00235500 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +RSadr_0=1 +RSadr_1=2 +RSadr_2=3 +RSadr_3=4 +Name_0=Задатчик +Name_1=Выносной пульт +Name_2=УКСВЭП +Name_3=БКСС ГД +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Read +DigiBut_6=Secret +DigiBut_7=Send +DigiBut_8=- +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[23550.X] +Protokol=3 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +RSadr_0=1 +RSadr_1=2 +RSadr_2=3 +RSadr_3=4 +Name_0=Задатчик +Name_1=Выносной пульт +Name_2=УКСВЭП +Name_3=БКСС ГД +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Read +DigiBut_6=Secret +DigiBut_7=Send +DigiBut_8=- +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + + +[Янтарь] +BaseAdr=$00213000 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +Use_4=1 +Use_5=1 +Use_6=1 +RSadr_0=1 +RSadr_1=2 +RSadr_2=3 +RSadr_3=4 +RSadr_4=5 +RSadr_5=6 +RSadr_6=7 +Name_0=УКСС БВ +Name_1=УКСС БИ1 +Name_2=УКСС БИ2 +Name_3=БКСС ГД +Name_4=УКСВЭП +Name_5=Задатчик +Name_6=Выносной пульт +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Calcul +DigiBut_6=Secret +DigiBut_7=Light +DigiBut_8=Raw +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[23550.2] +BaseAdr=$00235500 +PlusAdr=$10 +Use_0=1 +Use_1=1 +Use_2=1 +Use_3=1 +Use_4=1 +Use_5=1 +Use_11=1 +Use_12=1 +Use_13=1 +CANadr_0=0 +CANadr_1=1 +CANadr_2=2 +CANadr_3=4 +CANadr_4=6 +CANadr_5=8 +CANadr_11=5 +CANadr_12=7 +CANadr_13=9 +RSadr_0=1 +RSadr_1=2 +RSadr_2=3 +RSadr_3=4 +RSadr_4=6 +RSadr_5=8 +RSadr_11=5 +RSadr_12=7 +RSadr_13=9 +Name_0=Задатчик +Name_1=Выносной пульт +Name_2=БКСС ГД +Name_3=УКСС СИ СБ1 +Name_4=УКСС СВФ СБ1 +Name_5=УКСВЭП СБ1 +Name_11=УКСС СИ СБ2 +Name_12=УКСС СВФ СБ2 +Name_13=УКСВЭП СБ2 +DigiBut_0=Test +DigiBut_1=Def +DigiBut_2=Save +DigiBut_3=Load +DigiBut_4=Calibr +DigiBut_5=Calc +DigiBut_6=Secret +DigiBut_7=Send +DigiBut_8=Raw +DigiBut_9=- +DigiBut_10=- +DigiBut_11=- +DigiBut_12=- +DigiBut_13=- +DigiBut_14=- +DigiBut_15=Reset +DigiBut_16=Nothing at all + +[23550 БСУ] +BaseAdr=$0CEB0F1 +PlusAdr=-$10 +Use_0=1 +Use_1=1 +Name_0=БСУ1 +Name_1=БСУ2 +DigiBut_16=Nothing at all + diff --git a/SetTerminal_UKSS_CAN.cfg b/SetTerminal_UKSS_CAN.cfg new file mode 100644 index 0000000..f9f1cd7 --- /dev/null +++ b/SetTerminal_UKSS_CAN.cfg @@ -0,0 +1,39 @@ +-$A8 +-$B- +-$C+ +-$D+ +-$E- +-$F- +-$G+ +-$H+ +-$I+ +-$J- +-$K- +-$L+ +-$M- +-$N+ +-$O+ +-$P+ +-$Q- +-$R- +-$S- +-$T- +-$U- +-$V+ +-$W- +-$X+ +-$YD +-$Z1 +-cg +-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +-H+ +-W+ +-M +-$M16384,1048576 +-K$00400000 +-LE"d:\borland\delphi7\Projects\Bpl" +-LN"d:\borland\delphi7\Projects\Bpl" +-LUvcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;AsyncPro +-w-UNSAFE_TYPE +-w-UNSAFE_CODE +-w-UNSAFE_CAST diff --git a/SetTerminal_UKSS_CAN.dof b/SetTerminal_UKSS_CAN.dof new file mode 100644 index 0000000..28237ab --- /dev/null +++ b/SetTerminal_UKSS_CAN.dof @@ -0,0 +1,139 @@ +[FileVersion] +Version=7.0 +[Compiler] +A=8 +B=0 +C=1 +D=1 +E=0 +F=0 +G=1 +H=1 +I=1 +J=0 +K=0 +L=1 +M=0 +N=1 +O=1 +P=1 +Q=0 +R=0 +S=0 +T=0 +U=0 +V=1 +W=0 +X=1 +Y=1 +Z=1 +ShowHints=1 +ShowWarnings=1 +UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; +NamespacePrefix= +SymbolDeprecated=1 +SymbolLibrary=1 +SymbolPlatform=1 +UnitLibrary=1 +UnitPlatform=1 +UnitDeprecated=1 +HResultCompat=1 +HidingMember=1 +HiddenVirtual=1 +Garbage=1 +BoundsError=1 +ZeroNilCompat=1 +StringConstTruncated=1 +ForLoopVarVarPar=1 +TypedConstVarPar=1 +AsgToTypedConst=1 +CaseLabelRange=1 +ForVariable=1 +ConstructingAbstract=1 +ComparisonFalse=1 +ComparisonTrue=1 +ComparingSignedUnsigned=1 +CombiningSignedUnsigned=1 +UnsupportedConstruct=1 +FileOpen=1 +FileOpenUnitSrc=1 +BadGlobalSymbol=1 +DuplicateConstructorDestructor=1 +InvalidDirective=1 +PackageNoLink=1 +PackageThreadVar=1 +ImplicitImport=1 +HPPEMITIgnored=1 +NoRetVal=1 +UseBeforeDef=1 +ForLoopVarUndef=1 +UnitNameMismatch=1 +NoCFGFileFound=1 +MessageDirective=1 +ImplicitVariants=1 +UnicodeToLocale=1 +LocaleToUnicode=1 +ImagebaseMultiple=1 +SuspiciousTypecast=1 +PrivatePropAccessor=1 +UnsafeType=0 +UnsafeCode=0 +UnsafeCast=0 +[Linker] +MapFile=0 +OutputObjs=0 +ConsoleApp=1 +DebugInfo=0 +RemoteSymbols=0 +MinStackSize=16384 +MaxStackSize=1048576 +ImageBase=4194304 +ExeDescription= +[Directories] +OutputDir= +UnitOutputDir= +PackageDLLOutputDir= +PackageDCPOutputDir= +SearchPath= +Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;AsyncPro +Conditionals= +DebugSourceDirs= +UsePackages=1 +[Parameters] +RunParams= +HostApplication= +Launcher= +UseLauncher=0 +DebugCWD= +[Language] +ActiveLang= +ProjectLang= +RootDir=D:\Borland\Delphi7\Bin\ +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1049 +CodePage=1251 +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= +[HistoryLists\hlUnitAliases] +Count=1 +Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; diff --git a/SetTerminal_UKSS_CAN.dpr b/SetTerminal_UKSS_CAN.dpr new file mode 100644 index 0000000..296655a --- /dev/null +++ b/SetTerminal_UKSS_CAN.dpr @@ -0,0 +1,16 @@ +program SetTerminal_UKSS_CAN; + +uses + Forms, + CAN_Terminal in 'CAN_Terminal.pas' {CANTerminal}, + UNiiefa in 'UNiiefa.pas' {UNiiefa}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TCANTerminal, CANTerminal); + Application.CreateForm(TModbusForm, ModbusForm); + + Application.Run; +end. diff --git a/SetTerminal_UKSS_CAN.exe b/SetTerminal_UKSS_CAN.exe new file mode 100644 index 0000000..39bb389 Binary files /dev/null and b/SetTerminal_UKSS_CAN.exe differ diff --git a/SetTerminal_UKSS_CAN.res b/SetTerminal_UKSS_CAN.res new file mode 100644 index 0000000..e9a633a Binary files /dev/null and b/SetTerminal_UKSS_CAN.res differ diff --git a/ToolsCan.dcu b/ToolsCan.dcu new file mode 100644 index 0000000..9201d30 Binary files /dev/null and b/ToolsCan.dcu differ diff --git a/ToolsCan.pas b/ToolsCan.pas new file mode 100644 index 0000000..a758a8d --- /dev/null +++ b/ToolsCan.pas @@ -0,0 +1,443 @@ +unit ToolsCan; + + + +interface + +uses Windows, extctrls, {VarVar,} slcan, + Messages, SysUtils, Variants, Classes, Graphics, Controls, + Dialogs, StdCtrls, ComCtrls, Registry; + +type + tCanMsgStruct = Record + m_dwID : DWORD; // CAN identifier + m_bFF : BYTE; // CAN frame format + m_bDLC : BYTE; // CAN data length code + m_bData : array[1..8] of BYTE; // CAN data + m_dwTime : DWORD; // Receipt time in ms + end; + + +procedure OpenSlavna(speedcancode, select_port:integer); +procedure CloseSlavna(); +procedure InitSlavnaDll(); +function ReadMessageCanID(timerc:Integer):Integer; +procedure FreeSlavnaDll(); +procedure SetFilterIDCan(m_dwID : DWORD); +function WriteMessageCanID(cb:integer; var outstr:string):Integer; + + +var + + arrspeedcan : array [0..4] of Word = (SLCAN_BR_100K,SLCAN_BR_CIA_125K,SLCAN_BR_CIA_250K,SLCAN_BR_CIA_500K,SLCAN_BR_CIA_1000K); + //can + devicecount:longword; + hDevice:TSlCanDevice; + br:TSlCanBitRate; + OutMsg:TSlCanMessage; + + OutMsgArr:array[0..100] of TSlCanMessage; + +// InMsg:array [0..99] of TSlCanMessage; + CanInitedDLL : Boolean = False; + CanOpened : Boolean = False; + + InMsgCan : array [0..60000] of TSlCanMessage; + InEventCan : array [0..60000] of TSlCanEvent; + InEventCanTime : array [0..60000] of Longword; + + ReadCountCan:longword; + + ArrCanMessage : array [0..60000] of tCanMsgStruct; + ArrCanMessageSend : array [0..30] of tCanMsgStruct; + + CanMessageTransmit : tCanMsgStruct; + + FilterIDCAN : DWORD = 0; + TimePauseCanIn : longword; + +implementation + + + +procedure SetFilterIDCan(m_dwID : DWORD); +begin + + FilterIDCAN := m_dwID; + +end; + + + +function WriteMessageCanID(cb:integer; var outstr:string):Integer ; +const + cTxStatus:array [0..7] of string =('OK','TimeOut','BusOff','Abort','Disable','One shot error','Invalid mode','Unknown'); +var + i : Integer; + WriteStatus:byte; + WriteCount:Integer; + + b: Boolean; + +begin + + for i:=0 to cb-1 do + begin + OutMsg.ID:=ArrCanMessageSend[i].m_dwID; + OutMsg.Info:=SLCAN_MES_INFO_EXT; + + OutMsg.DataCount:= ArrCanMessageSend[0].m_bDLC; //8; + + OutMsg.Data[0]:=ArrCanMessageSend[i].m_bData[1]; + OutMsg.Data[1]:=ArrCanMessageSend[i].m_bData[2]; + OutMsg.Data[2]:=ArrCanMessageSend[i].m_bData[3]; + OutMsg.Data[3]:=ArrCanMessageSend[i].m_bData[4]; + OutMsg.Data[4]:=ArrCanMessageSend[i].m_bData[5]; + OutMsg.Data[5]:=ArrCanMessageSend[i].m_bData[6]; + OutMsg.Data[6]:=ArrCanMessageSend[i].m_bData[7]; + OutMsg.Data[7]:=ArrCanMessageSend[i].m_bData[8]; + + OutMsgArr[i]:=OutMsg; + + end; + + if (SlCan_DeviceWriteMessages(hDevice,@OutMsgArr,cb,@WriteStatus)) then + begin + if WriteStatus > 7 then WriteStatus:=7; + if WriteStatus = 0 then + outstr:=Format('Status CAN = %s.',[cTxStatus[0]]) + else + outstr:=Format('Status CAN = %s.',[cTxStatus[WriteStatus]]) + end + else + begin + outstr:=' Transmit error'; + result:= 7; + + end; + + result:= WriteStatus; + +{ + + + for i:=0 to cb-1 do + begin + + OutMsg.ID:=ArrCanMessageSend[i].m_dwID; + OutMsg.Info:=SLCAN_MES_INFO_EXT; + OutMsg.DataCount:= 8; + OutMsg.Data[0]:=ArrCanMessageSend[i].m_bData[1]; + OutMsg.Data[1]:=ArrCanMessageSend[i].m_bData[2]; + OutMsg.Data[2]:=ArrCanMessageSend[i].m_bData[3]; + OutMsg.Data[3]:=ArrCanMessageSend[i].m_bData[4]; + OutMsg.Data[4]:=ArrCanMessageSend[i].m_bData[5]; + OutMsg.Data[5]:=ArrCanMessageSend[i].m_bData[6]; + OutMsg.Data[6]:=ArrCanMessageSend[i].m_bData[7]; + OutMsg.Data[7]:=ArrCanMessageSend[i].m_bData[8]; + + b:=SlCan_DeviceWriteMessages(hDevice,@OutMsg,1,@WriteStatus); + + if (not b) then + begin + result:=-1; + exit ; + end; + + // Проверим статус передачи + if (WriteStatus<>SLCAN_TX_STATUS_OK) then + begin + result:=-2; + exit; + end; + + end; + result := 0; +} +end; + + + +function ReadMessageCanID(timerc:Integer):Integer ; +var + b:longbool; + k ,i , can1, can_error, can2 : Integer; + deltat : Longword; +begin + + can_error:=0; + TimePauseCanIn:=0; + if CanOpened then + begin + + for i:=0 to 60000-1 do + begin + InEventCanTime[i]:=0; + end; + + +// if (SlCan_DeviceSetStartTimeStamp(hDevice, 0)=False) then +// exit; + +// b:=SlCan_DeviceReadMessages(hDevice,timerc,@InMsgCan,60000,@ReadCountCan); +// b:=SlCan_DeviceReadEvents(hDevice,timerc,@InEventCan,60000,@ReadCountCan); + b:=SlCan_DeviceReadEvents(hDevice,timerc,@InEventCan,1000,@ReadCountCan); + + if (not b) then + begin + // CanMessage.m_dwID := 0; + result:=0; +// exit; + end; + + if (ReadCountCan>0 ) then + begin + + can1:=0; + can2:=0; + for i:=0 to ReadCountCan-1 do + begin + + if (InEventCan[i].EventType=0) then + begin + InMsgCan[can1] := InEventCan[i].Msg; + + deltat:=0; + if (i>0) then + deltat:=InEventCan[i].TimeStampLo - InEventCan[i-1].TimeStampLo + else + deltat:=0; + + inc(can1); + + if (deltat<>0) then + begin + InEventCanTime[can2]:= deltat; + inc(can2); + if (TimePauseCanIn0) and ((InMsgCan[i].ID=FilterIDCAN) or (InMsgCan[i].ID=(FilterIDCAN+$01)) )) + or (FilterIDCAN=0) then + begin + + ArrCanMessage[k].m_dwID := InMsgCan[i].ID; + + ArrCanMessage[k].m_bDLC := InMsgCan[i].DataCount; + + ArrCanMessage[k].m_bData[1] := InMsgCan[i].Data[0]; + ArrCanMessage[k].m_bData[2] := InMsgCan[i].Data[1]; + ArrCanMessage[k].m_bData[3] := InMsgCan[i].Data[2]; + ArrCanMessage[k].m_bData[4] := InMsgCan[i].Data[3]; + ArrCanMessage[k].m_bData[5] := InMsgCan[i].Data[4]; + ArrCanMessage[k].m_bData[6] := InMsgCan[i].Data[5]; + ArrCanMessage[k].m_bData[7] := InMsgCan[i].Data[6]; + ArrCanMessage[k].m_bData[8] := InMsgCan[i].Data[7]; + Inc(k); + + end + else + begin + + end; + + + end; + result:=k; + +// InMsg. + // Writeln(Format('read %d messages',[ReadCount])); + + end + else + begin + // CanMessage.m_dwID := 0; + result:=0; + end; + + +{ + k:=0; + for i:=0 to ReadCountCan-1 do + begin + if ((FilterIDCAN>0) and ((InMsgCan[i].ID=FilterIDCAN) or (InMsgCan[i].ID=(FilterIDCAN+$01)) )) + or (FilterIDCAN=0) then + begin + + ArrCanMessage[k].m_dwID := InMsgCan[i].ID; + ArrCanMessage[k].m_bData[1] := InMsgCan[i].Data[0]; + ArrCanMessage[k].m_bData[2] := InMsgCan[i].Data[1]; + ArrCanMessage[k].m_bData[3] := InMsgCan[i].Data[2]; + ArrCanMessage[k].m_bData[4] := InMsgCan[i].Data[3]; + ArrCanMessage[k].m_bData[5] := InMsgCan[i].Data[4]; + ArrCanMessage[k].m_bData[6] := InMsgCan[i].Data[5]; + ArrCanMessage[k].m_bData[7] := InMsgCan[i].Data[6]; + ArrCanMessage[k].m_bData[8] := InMsgCan[i].Data[7]; + Inc(k); + + end + else + begin + + end; + + + end; + result:=k; + +// InMsg. + // Writeln(Format('read %d messages',[ReadCount])); + + end + else + begin + // CanMessage.m_dwID := 0; + result:=0; + end; +} + + end + else + Result:=0; + + if (can_error>100) then + result:=1; + +end; + + + + + +procedure InitSlavnaDll(); +var + b:longbool; + +begin + + // Загрузим библиотеку. Необходимо это сделать один раз + // до вызова любой другой функции библиотеки. + CanInitedDLL:=SlCan_Load(nil,nil); + +end; + + + +procedure FreeSlavnaDll(); +var + b:longbool; + +begin + + // Загрузим библиотеку. Необходимо это сделать один раз + // до вызова любой другой функции библиотеки. + SlCan_Free(False); + CanInitedDLL:=False; + +end; + + +procedure OpenSlavna(speedcancode,select_port:integer); +var + b:longbool; +begin + + if (not CanInitedDLL) then exit; + + if CanOpened then Exit; + + // Выясним, сколько устройств доступно + devicecount:= SlCan_GetDeviceCount(); + if (devicecount=0) or (devicecount=INVALID_HANDLE_VALUE) or (devicecount=INVALID_HANDLE_VALUE-1) then exit; + + if (select_port>1) then + begin + if (select_port>devicecount) then + select_port:=devicecount; + end + else + select_port:=1; + // Получим ссылку на первое устройство + hDevice:= SlCan_GetDevice(select_port-1); + if (hDevice=INVALID_HANDLE_VALUE) then exit; + + // Откроем устройство. + b:= SlCan_DeviceOpen(hDevice); + if (not b) then exit; + + // При открытии устройства устанавливается максимально возможная + // скорость передачи. Но мы установим 125kb/s + br.BRP:=arrspeedcan[speedcancode]; + b:=SlCan_DeviceSetBitRate(hDevice,@br); + if (not b) then exit; + + b:= SlCan_DeviceSetEventLevel(hDevice,SLCAN_EVT_LEVEL_TIME_STAMP); + if (not b) then exit; + + + // Установим режим SLCAN_MODE_NORMAL + b:= SlCan_DeviceSetMode(hDevice,SLCAN_MODE_NORMAL); + if (not b) then exit; + + + b:= SlCan_DeviceSetTXTimeOut(hDevice,100); + if (not b) then exit; + + CanOpened:=True; + +end; + + +procedure CloseSlavna(); +var + b:longbool; +begin + { + // Выясним, сколько устройств доступно + devicecount:= SlCan_GetDeviceCount(); + if (devicecount=0) then exit; + + // Получим ссылку на первое устройство + hDevice:= SlCan_GetDevice(0); +} + + + if (hDevice=INVALID_HANDLE_VALUE) then exit; + + // Закроем устройство. + b:= SlCan_DeviceClose(hDevice); + if (not b) then exit; + + CanOpened := False; + { + // При открытии устройства устанавливается максимально возможная + // скорость передачи. Но мы установим 125kb/s + br.BRP:=speedcan[rgBaudCAN.ItemIndex]; + b:=SlCan_DeviceSetBitRate(hDevice,@br); + if (not b) then exit; + + // Установим режим SLCAN_MODE_NORMAL + b:= SlCan_DeviceSetMode(hDevice,SLCAN_MODE_NORMAL); + if (not b) then exit; + } +end; + + + + + + + +end. diff --git a/ToolsRS.dcu b/ToolsRS.dcu new file mode 100644 index 0000000..3704586 Binary files /dev/null and b/ToolsRS.dcu differ diff --git a/ToolsRS.pas b/ToolsRS.pas new file mode 100644 index 0000000..477b781 --- /dev/null +++ b/ToolsRS.pas @@ -0,0 +1,285 @@ +unit ToolsRS; + +interface + +uses + + Forms, AdPort, OoMisc; + + var + + BufIn, BufOut : Array [0..200000] of byte; + FlagRS : Boolean = false; + FlagAbortKey : Boolean = false; + + Count_error : Integer = 0; + RSTimeOut : Boolean = True; + + procedure SendAddress (AdrCon:Byte); + function RunCmdNew (Cmd : Byte; LengthOut,LengthIn :LongWord): Byte; + function ContrlolSumCRC16(BufCRC : Array of Byte; LengthB : LongWord): Word; + function LB(X: Word): Byte; + function HB(X: Word): Byte; + +implementation + +uses CAN_Terminal; + +Function ContrlolSumCRC16(BufCRC : Array of Byte; LengthB : LongWord) : Word; +Var + CRC : Word; + Index1, + Index2: LongWord; + rb : Byte; +Begin + + CRC := $ffff; + For Index1 := 0 To LengthB-1 Do + Begin + CRC := (CRC and $FFFF); + CRC := (CRC XOR (BufCRC[Index1])); + For Index2 := 1 To 8 Do + If ((CRC And $1) <> 0) Then + CRC := ((CRC SHR 1) xor $A001) else CRC := (CRC SHR 1) + end; + Result := (CRC and $FFFF); + +end; + +procedure SendAddress (AdrCon:Byte); +var + ET : EventTimer; + +begin + if AdrCon = 0 then exit; + CANTerminal.MyCommPort.Parity:=pNone; + CANTerminal.MyCommPort.PutChar(Chr(AdrCon)); +end; + + + +function RunCmdNew(Cmd : Byte; LengthOut,LengthIn :LongWord): Byte; +var + + b : Byte; + CSum,PAdr : Word; + CSumb : Byte; + BB : LongWord; + bb1,bb2 : Word; + i,i1,i2 : LongWord; + ET : EventTimer; + Ch : Char; + BufSize : LongWord ; + Posit : LongWord; + Block1 : Array [0..9000] of byte; + FlagOpenRS : Boolean; + Fr : Byte; + +begin + if CANTerminal.MyCommPort.OutBuffUsed <> 0 then exit; + + FlagRs:=True; + FlagAbortKey:=False; + CANTerminal.AbortKey.Visible:=True; + + FlagOpenRS := CANTerminal.MyCommPort.Open; + + CANTerminal.MyCommPort.Open:=True; + + CANTerminal.MyCommPort.FlushInBuffer; + CANTerminal.MyCommPort.FlushOutBuffer; + + Posit:=0; + CANTerminal.PBRs.Position:=0; + CANTerminal.PBRs.Max:=LengthOut+LengthIn; + + Count_error := 0; + + BufIn[0]:=0; + BufIn[1]:=0; + BufIn[2]:=0; + BufIn[3]:=0; + BufIn[4]:=0; + BufIn[5]:=0; + BufIn[6]:=0; + BufIn[7]:=0; + BufIn[8]:=0; + BufIn[9]:=0; + + Padr:=$3f8+5; + + if Cmd<>0 then SendAddress(Cmd); + + BufOut[LengthOut]:=0; + BufOut[LengthOut+1]:=0; + BufOut[LengthOut+2]:=0; + BufOut[LengthOut+3]:=0; + + i1:=LengthOut+1; + i2:=0; + + repeat + + if i1>=1024 then begin + + for i:=0 to 1023 do Block1[i] := BufOut[i+i2]; + + while CANTerminal.MyCommPort.OutBuffUsed<>0 do; + + CANTerminal.MyCommPort.PutBlock(Block1,1024); + Posit:=Posit+1024; + + i1:=i1-1024; + i2:=i2+1024; + + end + else + begin + + if ((i1<1024) and (i1>0)) then begin + + for i:=0 to i1-1 do Block1[i] := BufOut[i+i2]; + + while CANTerminal.MyCommPort.OutBuffUsed<>0 do; + + CANTerminal.MyCommPort.PutBlock(Block1,i1); + Posit:=Posit+i1; + + while CANTerminal.MyCommPort.OutBuffUsed<>0 do; + + i1:=0; + i2:=LengthOut; + end; + + end; + CANTerminal.PBRs.Position:=Posit; + Application.ProcessMessages; + + if FlagAbortKey then begin + Result:=3; + FlagRs:=False; + + CANTerminal.MyCommPort.Open:=FlagOpenRS; + exit; + + FlagAbortKey:=False; + CANTerminal.AbortKey.Visible:=False; + end; + + until (i1=0); + + while CANTerminal.MyCommPort.OutBuffUsed<>0 do; + + i:=0; + + while i<(LengthIn) do begin + + bb:=0; + + RSTimeOut:= false; + NewTimer(ET,Round(CANTerminal.TimeWait.Value)); + + repeat + CANTerminal.MyCommPort.ProcessCommunications; + // Application.ProcessMessages; + + if CANTerminal.MyCommPort.InBuffUsed>1024 then begin + CANTerminal.MyCommPort.GetBlock(Block1,1024); + for i1:=0 to 1023 do BufIn[i+i1]:=Block1[i1]; + i:=i+i1; + Posit:=Posit+1024; + end; + + If CANTerminal.MyCommPort.CharReady then + begin + inc(Posit); + CANTerminal.PBRs.Position:=Posit; + Ch:=CANTerminal.MyCommPort.GetChar; + bb:=1; + + BufIn[i]:=Ord(Ch); + inc(i); + + // if not ((i>2) and (i > BufIn[2]+4)) +// then Application.ProcessMessages; + + Break; + + end; + + if FlagAbortKey then begin + FlagAbortKey:=False; + CANTerminal.AbortKey.Visible:=False; + Result:=3; // Получение прервано кнопкой + FlagRs:=False; + CANTerminal.MyCommPort.Open:=FlagOpenRS; + exit; + end; + + until TimerExpired(ET) { or (RSTimeOut) }; + + If bb=0 then Break; + + end; + + CANTerminal.MyCommPort.FlushInBuffer; + CANTerminal.MyCommPort.FlushOutBuffer; + + + FlagAbortKey:=False; + CANTerminal.AbortKey.Visible:=False; + + If bb=0 then + begin + Result:=1; // ничего не пришло... + CANTerminal.MyCommPort.Open:=FlagOpenRS; + FlagRs:=False; + exit; + end; + + Csum:=ContrlolSumCRC16(BufIn,LengthIn-2); + + if CSum<>(BufIn[LengthIn-2]+BufIn[LengthIn-1]*256) then + begin + Result:=2; // не сошлась контрольная сумма + FlagRs:=False; + CANTerminal.MyCommPort.Open:=FlagOpenRS; + exit; + end + else + Result:=0; + + CANTerminal.MyCommPort.Open:=FlagOpenRS; + FlagRs:=False; + CSum:=i; + if PAdr=0 then CSum:=i; + +end; + + + + +{Получение младшего байта} +function LB(X: Word): Byte; +var b1: Byte; +begin + asm + mov ax,X + mov b1,al + end; + Result:=b1; +end; + +{Получение старшего байта} +function HB(X: Word): Byte; +var b1: Byte; +begin + asm + mov ax,X + mov b1,ah + end; + Result:=b1; +end; + + +end. diff --git a/UNiiefa.dcu b/UNiiefa.dcu new file mode 100644 index 0000000..a829e7e Binary files /dev/null and b/UNiiefa.dcu differ diff --git a/UNiiefa.ddp b/UNiiefa.ddp new file mode 100644 index 0000000..4370276 Binary files /dev/null and b/UNiiefa.ddp differ diff --git a/UNiiefa.dfm b/UNiiefa.dfm new file mode 100644 index 0000000..73916c4 Binary files /dev/null and b/UNiiefa.dfm differ diff --git a/UNiiefa.pas b/UNiiefa.pas new file mode 100644 index 0000000..b7d9700 --- /dev/null +++ b/UNiiefa.pas @@ -0,0 +1,1253 @@ +unit UNiiefa; + +interface + +uses + + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, Buttons, RXSpin, ExtCtrls, rxPlacemnt, OoMisc, AdStatLt, Mask, OleCtrls,IniFiles,Registry, + chartfx3, TeEngine, Series, TeeProcs, Chart, Menus, ToolsRS, ToolsCan, + AdPort, RxHook, RXCtrls, ToolWin, ComCtrls, + RXSwitch, rxToolEdit, Grids, ValEdit, DBGrids; + +type + + TGridCracker = class(TStringGrid); + + + TMessag = record + Mask: Byte; + Addr: Word; + Leng: integer; + Data: array[0..3] of SmallInt; + Surs: integer; + end; + + TUnit = record + Data: integer; + Age: integer; + Surs: integer; + end; + + TModbusForm = class(TForm) + Memo1: TMemo; + FormStorage2: TFormStorage; + myTimer: TTimer; + GroupBox: TGroupBox; + GroupBox2: TGroupBox; + DiggAddrEdit: TRxSpinEdit; + SetButton: TButton; + GroupBox1: TGroupBox; + DecLab: TRadioButton; + HexLab: TRadioButton; + AdreLaba: TLabel; + dataLaba: TLabel; + GroupBox3: TGroupBox; + AnaStartLaba: TLabel; + AnaStart: TRxSpinEdit; + DigiStartLaba: TLabel; + DigiStart: TRxSpinEdit; + AnaLenLaba: TLabel; + AnaLen: TRxSpinEdit; + DigiLenLaba: TLabel; + DigiLen: TRxSpinEdit; + FadeBox: TCheckBox; + Label9: TLabel; + FadeSpin: TRxSpinEdit; + AnaStart24: TButton; + AnaStart64: TButton; + AnaLen64: TButton; + DigiStart0: TButton; + DigiLen32: TButton; + DigiLen24: TButton; + ColorBox: TCheckBox; + DataGrid: TStringGrid; + DataLenEdit: TRxSpinEdit; + Label1: TLabel; + BitGroup: TPanel; + Panel1: TPanel; + RadioUp: TRadioButton; + RadioDn: TRadioButton; + AutoBox: TCheckBox; + AutoTimeEdit: TRxSpinEdit; + + + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure Memo1DblClick(Sender: TObject); + procedure Memo1Change(Sender: TObject); +// procedure btnAnalogClick(Sender: TObject); + procedure ColorBoxClick(Sender: TObject); + procedure FadeBoxClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure myTimerTimer(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure ReadAnalog; + procedure AnaLenChange(Sender: TObject); + procedure DigiLenChange(Sender: TObject); + procedure FadeSpinChange(Sender: TObject); + procedure SetButtonClick(Sender: TObject); + procedure SetButtonDo(Sender: TObject); + procedure CommButtClick(Sender: TObject); + procedure CommButtDo(Sender: TObject); + procedure DigiClick(Sender: TObject); + procedure AnaStartChange(Sender: TObject); + procedure AnaValue(Sender: TObject); + procedure DigValue(Sender: TObject); + procedure DigiStartChange(Sender: TObject); + procedure DigiLabWrite; + procedure AnaLabWrite; + procedure DecLabClick(Sender: TObject); + procedure HexLabClick(Sender: TObject); + procedure AnaStart24Click(Sender: TObject); + procedure AnaStart64Click(Sender: TObject); + procedure AnaLen64Click(Sender: TObject); + procedure DigiStart0Click(Sender: TObject); + procedure DigiLen24Click(Sender: TObject); + procedure DigiLen32Click(Sender: TObject); + + procedure BitButClick(Sender: TObject); + + procedure HexaDec; + + procedure AnaRewrite; + procedure DigiRewrite; + procedure DigiColWrite(Byte: word; Column: integer; Age: integer; Surs: integer); + + procedure DigiBoxWrite(Surs: integer); + + procedure DoNothing(Sender: TObject); + procedure HagaNada(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); + + procedure RenameButton(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); + + procedure Renamed(Sender: TObject); + procedure Renamido(Sender: TObject; var Key: Char); + procedure SaveProjectComms(ProjID: string); + + procedure ReceiveCanData(Mess: TMessag); + procedure DataLenEditChange(Sender: TObject); + procedure DataGridKeyPress(Sender: TObject; var Key: Char); + procedure DataGridSetEditText(Sender: TObject; ACol, ARow: Integer; + const Value: String); + procedure DataGridDrawCell(Sender: TObject; ACol, ARow: Integer; + Rect: TRect; State: TGridDrawState); + procedure DataGridSelectCell(Sender: TObject; ACol, ARow: Integer; + var CanSelect: Boolean); + procedure DataGridGetEditText(Sender: TObject; ACol, ARow: Integer; + var Value: String); + procedure AutoTimeEditChange(Sender: TObject); + + private + { Private declarations } + + Anapan : Array[0..63] of TPanel; + Digipan : Array[0..511] of Tpanel; + Digibox : Array[0..15] of TCheckBox; + Digibut : Array[0..16] of TButton; + + Bitbut : Array[0..3] of TRadioButton; + + DigiLab: Array[0..31] of TLabel; + AnaLab: Array[0..7] of TLabel; + + AnalogStart : Integer; + AnalogLength : Integer; + DigitalStart : Integer; + DigitalLength : Integer; + + Unites : Array[0..127] of TUnit; + + kownt: integer; + waiste: integer; + fade: integer; + reColor: integer; + doReColor: boolean; + + public + + Numer: integer; + RSadr: cardinal; + RXadr: longword; + TXadr: longword; + Protokol: integer; + + + { Public declarations } + end; + +var + ModbusForm : TModbusForm; + rData2, rData3 : double; + FIniFile : TRegIniFile; + FRegFile : TIniFile; + Temper1,Temper2 : Array [0..12] of Real; + InsideFUst : boolean = False; + + InsideSet : boolean = False; + InsideComm : boolean = False; + + LastSender : TObject; + + ErrorCmd : boolean = False; + + KT1,KT2,KT3 : Array [0..12] of Real; + + UNew : SmallInt; + MomentNew : SmallInt; + + UNewZ : Integer; + + Count1 : Integer = 0; + Count2 : Integer = 0; + + NameEdit: TEdit; + + ArrNiiefaAnalog : Array [0..100] of Word; + ArrNiiefaDigital : Array [0..100] of Word; + flaganalogdigital : boolean = false; + + Wordt: word; + + ProjectQua : integer = 0; + ProjectNum : integer = 0; + + clBlueGradient : array[0..20,0..1] of TColor; + clRedGradient : array[0..20] of TColor; + clGreenGradient : array[0..20,0..1] of TColor; + + EmptyCell:TGridRect; + +const + + clGrad : integer = 20; // correct above + + AnalogMaxLength: Integer = 64; + DigitalMaxLength: Integer = 512; + MaxAdr: Integer = 127; + + clPink : TColor = $AAAAFF; + + implementation + +uses CAN_Terminal; + +{$R *.DFM} + +procedure TModbusForm.FormClose(Sender: TObject; var Action: TCloseAction); + +begin +// FlagApplication:=True; + myTimer.Enabled:=False; + +// CANTerminal.Zakaz.UKSS[Numer].Go.OnClick := CANTerminal.ShoWinClick; + +// (Sender as Tform).Destroy; +// Oprosc.Checked:=False; +end; + +procedure TModbusForm.Memo1DblClick(Sender: TObject); +begin + Memo1.Clear; +end; + +procedure TModbusForm.Memo1Change(Sender: TObject); +var + i : Integer; +begin + i:=Memo1.Lines.Count; + if i>100 then Memo1.Clear; +end; +{ +procedure TModbusForm.btnAnalogClick(Sender: TObject); + +begin + + if InsideSet then SetButtonDo(Sender); + if InsideComm then CommButtDo(LastSender); + + if not InsideFUst then + begin + InsideFUst := True; + try + ReadAnalog; + finally + InsideFUst := False; + end; + end; +end; +} +procedure TModbusForm.ColorBoxClick(Sender: TObject); +begin + if ColorBox.Checked then + begin + if not FadeBox.Checked + then FadeSpin.Value := 10 + end else FadeSpin.Value := 0; +end; + +procedure TModbusForm.FadeBoxClick(Sender: TObject); +begin + if FadeBox.Checked then + begin + ColorBox.Checked := true; + if (FadeSpin.Value = 10) or (FadeSpin.Value = 0) then FadeSpin.Value := 5 + end else if ColorBox.Checked then FadeSpin.Value := 10; +end; + +procedure TModbusForm.FormCreate(Sender: TObject); +var i: integer; + inifile : TIniFile; + nom,num: string; + +begin + myTimer.Enabled:=True; + FormStorage2.IniFileName:=PathExe+'Terminal.ini'; + + for i:= 0 to clGrad do + begin + + clRedGradient[clGrad-i] := + $0000FF - + ((6300 div clGrad)*i) div 100+ + ((((1920 div clGrad)*i) div 10) shl 8) + + ((((1920 div clGrad)*i) div 10) shl 16); + + clGreenGradient[clGrad-i,0] := + 160 + ((255-160) div clGrad) * i + + $00FF00 + + ((140 + ((255-140) div clGrad)*i) shl 16); + + clBlueGradient[clGrad-i,0] := + 180 + ((255-180) div clGrad) * i + + $00FF00 + + ((160 + ((255-160) div clGrad)*i) shl 16); + + clGreenGradient[clGrad-i,1] := + 150 + ((255-150) div clGrad) * i + + ((210 + ((255-210) div clGrad)*i) shl 8) + + $FF0000; + + clBlueGradient[clGrad-i,1] := + 160 + ((255-160) div clGrad) * i + + ((220 + ((255-220) div clGrad)*i) shl 8) + + $FF0000; + + end; + + for i:= 0 to 127 do Unites[i].Age :=0; + + for i:= 0 to 31 do + begin + DigiLab[i]:=TLabel.Create(self); + DigiLab[i].ParentFont:=false; + DigiLab[i].Parent:=GroupBox; + DigiLab[i].Top:=15; + DigiLab[i].Left:=10+ i*16 + (i div 4)*3; + DigiLab[i].Font.Color :=clNavy; + end; + DigiLabWrite; + + for i:= 0 to 511 do + begin + DigiPan[i]:=TPanel.Create(self); + DigiPan[i].ParentFont:=false; + DigiPan[i].Parent:=GroupBox; + DigiPan[i].Top:=30+(i mod 16)*16 + ((i mod 16)div 8)*3; + DigiPan[i].Left:=10+(i div 16)*16 + ((i div 16)div 4)*3; + DigiPan[i].Width:=13; + DigiPan[i].Height:=13; + DigiPan[i].OnClick := DigValue; + DigiPan[i].Tag:=i; + end; + + for i:= 0 to 7 do + begin + AnaLab[i]:=TLabel.Create(self); + AnaLab[i].ParentFont:=false; + AnaLab[i].Parent:=GroupBox; + AnaLab[i].Top:=290; + AnaLab[i].Left:=10+i *67; + AnaLab[i].Font.Color :=clNavy; + AnaLab[i].Alignment := taCenter; + AnaLab[i].width := 61; + end; + AnaLabWrite; + + for i:= 0 to 63 do + begin + AnaPan[i]:=TPanel.Create(self); + AnaPan[i].ParentFont:=false; + AnaPan[i].Parent:=GroupBox; + AnaPan[i].Top:=305+(i mod 8)*32; + AnaPan[i].Left:=10+(i div 8)*67 ; + AnaPan[i].Width:=61; + AnaPan[i].Height:=25; + AnaPan[i].Font.Size:=12; + AnaPan[i].ShowHint:=true; + AnaPan[i].Tag :=i; + AnaPan[i].OnClick := AnaValue; + end; + + for i:= 0 to 15 do + begin + DigiBox[i]:=TCheckBox.Create(self); + DigiBox[i].Parent:=GroupBox2; + DigiBox[i].Top:=20+(i mod 4)*20; + DigiBox[i].Left:=20+(i div 4)*55; + DigiBox[i].Width:=60; + DigiBox[i].Height:=20; + DigiBox[i].ShowHint:=true; + DigiBox[i].OnClick := DigiClick; + DigiBox[i].Hint := Project.DigiButNames[i]; + end; + + for i:= 0 to 15 do + begin + DigiBut[i]:=TButton.Create(self); + DigiBut[i].Parent:=GroupBox1; + DigiBut[i].Top:={20+}20+(i mod 4)*25; + DigiBut[i].Left:=20+(i div 4)*55; + DigiBut[i].Width:=50; + DigiBut[i].Height:=20; + DigiBut[i].ShowHint:=true; + DigiBut[i].OnClick := CommButtClick; + DigiBut[i].Tag := i; + DigiBut[i].OnContextPopup := RenameButton; + DigiBut[i].Caption:= Project.DigiButNames[i]; + + end; + + DigiBut[16]:=TButton.Create(self); + DigiBut[16].Parent:=GroupBox1; + DigiBut[16].Top:={20 + }20 + 4*25; + DigiBut[16].Left:=20 + 55; + DigiBut[16].Width:=105; + DigiBut[16].Height:=20; + DigiBut[16].ShowHint:=true; + DigiBut[16].OnClick := CommButtClick; + DigiBut[16].Tag := 16; + DigiBut[16].OnContextPopup := RenameButton; + DigiBut[16].Caption:= Project.DigiButNames[16]; + + DigiLabWrite; + AnaLabWrite; + HexaDec; + + NameEdit:=TEdit.Create(self); + + for i:= 0 to 3 do + begin + DataGrid.Cells[0,i]:='0'; + Bitbut[i]:=TRadioButton.Create(self); + Bitbut[i].parent:=BitGroup; + BitBut[i].BringToFront; + Bitbut[i].Caption:=''; + Bitbut[i].top:= 2+17*i; + Bitbut[i].left:= 0; + Bitbut[i].Width := 17; + Bitbut[i].Height := 17; + Bitbut[i].TabOrder:=i; + Bitbut[i].Tag:=i; + Bitbut[i].OnClick:=BitButClick; + end; + + inifile := TIniFile.Create(PathExe+'Terminal.ini'); + + ProjectQua := strtoint(Inifile.ReadString('Projects','ProjectQua','0')); + ProjectNum := strtoint(Inifile.ReadString('Projects','ProjectNum','0')); + + inifile.Free; + + FadeSpinChange(Sender); +end; + +procedure TModbusForm.myTimerTimer(Sender: TObject); +var + i : integer; + doIt: boolean; +begin + + if(AutoBox.Checked) then + if(AutoTimeEdit.Value > 0) then + begin + if(AutoBox.Tag > 0) then AutoBox.Tag:= AutoBox.Tag-1; + + if(AutoBox.Tag = 0) then + begin + SetButtonDo(Sender); + AutoBox.Tag:= trunc(AutoTimeEdit.Value); + end; + end; + + if myTimer.Tag > 0 then myTimer.Tag:= myTimer.Tag-1 + else begin + + myTimer.Tag:=10; + + Fade:=trunc(FadeSpin.Value); + + inc(waiste); + if Waiste >= Fade then + begin + waiste :=1; + doIt := true; + end else doIt := false; + + if doIt or doReColor then + for i:= 0 to 127 do + if Unites[i].Age > 0 then + begin + + dec(Unites[i].Age); + if Fade = 0 then Unites[i].Age := 0; + if Fade = 1 then dec(Unites[i].Age); // еще раз + if Fade = 10 then Unites[i].Age := reColor; + if Unites[i].Age <0 then Unites[i].Age:=0; // бывает + + if (i>= AnalogStart) + and(i< AnalogStart + AnalogLength) + then Anapan[i-AnalogStart].Color := clBlueGradient[Unites[i].Age][Unites[i].Surs]; + + if (i>= DigitalStart) + and(i< DigitalStart + DigitalLength) + then DigiColWrite(Unites[i].Data,i-DigitalStart,Unites[i].Age,Unites[i].Surs); + + end; + + doReColor:=false; + + end; + +end; + + +procedure TModbusForm.FormShow(Sender: TObject); +var + i: integer; + +begin + + myTimer.Enabled:=True; + + AnalogStart := trunc(AnaStart.Value); + DigitalStart:= trunc(DigiStart.Value); + AnalogLength:= trunc(AnaLen.Value); + DigitalLength:=trunc(DigiLen.Value); + + for i:=0 to 15 do + DigiBox[i].Caption:= 'Bit '+inttostr(i); + + AnaLenChange(Sender); + DigiLenChange(Sender); + AnaStartChange(Sender); + DigiStartChange(Sender); + FadeSpinChange(Sender); + + if Protokol=3 then DataLenEdit.MaxValue:=4 + else DataLenEdit.MaxValue :=3; + DataLenEditChange(Sender); + + BitBut[0].Checked:=true; + TGridCracker(DataGrid).SetFocus; + +end; + +procedure TModbusForm.ReadAnalog; +Var + i,Bout : Word; + what:integer; + Data : SmallInt; + +begin + + Memo1.Lines.Add('Read analog...'); + + BufOut[0] := RSadr; + BufOut[1]:=3; + BufOut[2]:=HB(AnalogStart); + BufOut[3]:=LB(AnalogStart); + BufOut[4]:=HB(AnalogLength); + BufOut[5]:=LB(AnalogLength); + Bout := ContrlolSumCRC16(BufOut,6); + BufOut[6]:=LB(Bout); + BufOut[7]:=HB(Bout); + + what := RunCmdNew(0,8,AnalogLength*2+5); + + If not((what=0)or(what=2)) then + begin + Memo1.Lines.Add('!!! Error !!!'); + exit; + end; + + if (what=0) + then Memo1.Lines.Add('Ok!') + else Memo1.Lines.Add('Well...'); + inc(Count2); + + If what=0 then + begin + for i:=0 to AnalogLength-1 do + begin + Data:=Round(BufIn[i*2+1+3] + BufIn[i*2+3]*256); + Unites[AnalogStart+i].Data := Data; + Unites[AnalogStart+i].Age := reColor; + end; + AnaRewrite; + end; +end; + +procedure TModbusForm.AnaLabWrite; +var i: integer; +begin + if(Anastart.Value+AnaLen.Value > 128) then + AnaLen.Value := 128-Anastart.Value; + + for i:= 0 to 7 do + if (i*8+trunc(AnaStart.value))<128 then + begin + + if HexLab.Checked then + AnaLab[i].Caption:='0x'+inttohex(i*8+trunc(AnaStart.value),2); + if DecLab.Checked then + AnaLab[i].Caption := inttostr(i*8+trunc(AnaStart.value)); + + end + else AnaLab[i].Caption:=''; + +end; + +procedure TModbusForm.AnaStartChange(Sender: TObject); +var i: integer; +begin + if(Anastart.Value+AnaLen.Value > 128) then + AnaLen.Value := 128-Anastart.Value; + AnalogStart := trunc(Anastart.Value); + AnaLabWrite; + AnaRewrite; +end; + +procedure TModbusForm.AnaLenChange(Sender: TObject); +var i: integer; +begin + if(Anastart.Value+AnaLen.Value > 128) then + Anastart.Value := 128-AnaLen.Value; + AnalogLength:=trunc(AnaLen.Value); + AnaRewrite; +end; + +procedure TModbusForm.DigiLabWrite; +var i: integer; +begin + for i:= 0 to 31 do + begin + if(DecLab.Checked) + then DigiLab[i].Caption:=inttostr(i+trunc(DigiStart.value)); + if(HexLab.Checked) + then DigiLab[i].Caption:=inttohex(i+trunc(DigiStart.value),2); + if(i+trunc(DigiStart.value)>127) then DigiLab[i].Caption:=''; + end; +end; + + +procedure TModbusForm.DigiStartChange(Sender: TObject); +var i: integer; +begin + if(Digistart.Value+DigiLen.Value > 128) then + DigiLen.Value := 128-Digistart.Value; + DigitalStart := trunc(Digistart.Value); + DigiLabWrite; + DigiRewrite; +end; + +procedure TModbusForm.DigiLenChange(Sender: TObject); +var i: integer; +begin + if(Digistart.Value+DigiLen.Value > 128) then + Digistart.Value := 128-DigiLen.Value; + DigitalLength:=trunc(DigiLen.Value); + DigiRewrite; +end; + + +procedure TModbusForm.SaveProjectComms(ProjID: string); +var i: integer; + inifile : TIniFile; + nom: string; +begin + inifile := TIniFile.Create(PathExe+'Terminal.ini'); + + for i:=0 to 16 do + begin + nom := 'DigiBut_'+inttostr(i); + inifile.WriteString(ProjID,nom,DigiBut[i].Caption); + end; + + inifile.Free; + +end; + + +procedure TModbusForm.FadeSpinChange(Sender: TObject); +begin + Fade:=trunc(FadeSpin.Value); + if Fade = 0 then + begin + reColor := 0; + FadeBox.Checked :=false; + ColorBox.Checked := false; + end else + begin + reColor := clGrad; + if Fade = 10 then FadeBox.Checked := false + else FadeBox.Checked := true; + end; + doReColor:=true; +end; + +procedure TModbusForm.SetButtonDo(Sender: TObject); +var Bout,what: word; + CanStr : String; + Mess: Tmessag; + i: integer; + XXadr: cardinal; +begin + + Memo1.Lines.Add('Setting settings...'); + + mess.Leng := trunc(DataLenEdit.Value); + + mess.Mask := 0; + + if mess.Leng = 0 then mess.Mask := 0; + if mess.Leng = 1 then mess.Mask := 4; + if mess.Leng = 2 then mess.Mask := 6; + if mess.Leng = 3 then mess.Mask := 7; + if mess.Leng = 4 then mess.Mask := $FF; + + mess.Addr := round(DiggAddrEdit.Value); + + for i:=0 to 3 do mess.Data[i] := strtoint(DataGrid.Cells[0,i]); + + if RadioUp.Checked + then begin XXadr:= TXadr; mess.Surs := 0 end + else begin XXadr:= RXadr; mess.Surs := 1 end; + + if Protokol=3 then + begin + ArrCanMessageSend[0].m_dwID := XXadr + mess.Addr; + ArrCanMessageSend[0].m_bDLC := mess.Leng*2; + ArrCanMessageSend[0].m_bData[1] := HB(mess.Data[0]); + ArrCanMessageSend[0].m_bData[2] := LB(mess.Data[0]); + ArrCanMessageSend[0].m_bData[3] := HB(mess.Data[1]); + ArrCanMessageSend[0].m_bData[4] := LB(mess.Data[1]); + ArrCanMessageSend[0].m_bData[5] := HB(mess.Data[2]); + ArrCanMessageSend[0].m_bData[6] := LB(mess.Data[2]); + ArrCanMessageSend[0].m_bData[7] := HB(mess.Data[3]); + ArrCanMessageSend[0].m_bData[8] := LB(mess.Data[3]); + end else begin + ArrCanMessageSend[0].m_dwID := XXadr; + ArrCanMessageSend[0].m_bDLC := 8; + ArrCanMessageSend[0].m_bData[5] := mess.Mask shl 5; + ArrCanMessageSend[0].m_bData[6] := LB(mess.Addr); + ArrCanMessageSend[0].m_bData[8] := LB(mess.Data[0]); + ArrCanMessageSend[0].m_bData[7] := HB(mess.Data[0]); + ArrCanMessageSend[0].m_bData[2] := LB(mess.Data[1]); + ArrCanMessageSend[0].m_bData[1] := HB(mess.Data[1]); + ArrCanMessageSend[0].m_bData[4] := LB(mess.Data[2]); + ArrCanMessageSend[0].m_bData[3] := HB(mess.Data[2]); + end; + + WriteMessageCanID(1, CanStr); + + ReceiveCanData(mess); + +end; + +procedure TModbusForm.SetButtonClick(Sender: TObject); +var Bout,what: word; +begin + SetButtonDo(Sender); +end; + + +procedure TModbusForm.CommButtDo(Sender: TObject); +var Bout,what: word; + Mess: Tmessag; + CanStr : String; + +begin + Memo1.Lines.Add('Command commands...'); + + what := (Sender as TButton).Tag; + if what <16 + then what := 1 shl what + else what := 0; + + mess.Mask := 4; + mess.Addr := 127; + mess.Data[0] := what; + mess.Data[1] := 0; + mess.Data[2] := 0; + mess.Surs := 1; + + ArrCanMessageSend[0].m_dwID := RXadr; + ArrCanMessageSend[0].m_bDLC := 8; + + ArrCanMessageSend[0].m_bData[5] := mess.Mask shl 5; + ArrCanMessageSend[0].m_bData[6] := LB(mess.Addr); + + ArrCanMessageSend[0].m_bData[8] := LB(mess.Data[0]); + ArrCanMessageSend[0].m_bData[7] := HB(mess.Data[0]); + + ArrCanMessageSend[0].m_bData[2] := LB(mess.Data[1]); + ArrCanMessageSend[0].m_bData[1] := HB(mess.Data[1]); + + ArrCanMessageSend[0].m_bData[4] := LB(mess.Data[2]); + ArrCanMessageSend[0].m_bData[3] := HB(mess.Data[2]); + + WriteMessageCanID(1, CanStr); + + ReceiveCanData(mess); + +end; + + +procedure TModbusForm.CommButtClick(Sender: TObject); +var Bout,what: word; +begin + + CommButtDo(Sender); +// if not oprosc.Checked then CommButtDo(Sender) +// else +// begin InsideComm := true; +// LastSender := Sender; +// end; + +end; + + +procedure TModbusForm.DigiClick(Sender: TObject); +var i,bout: word; +begin + bout := 0; + for i:=0 to 15 do + if digiBox[i].Checked then bout := bout or (1 shl (i)); + DataGrid.Cells[0, BitGroup.Tag ] := inttostr(bout); + +end; + +procedure TModbusForm.HexaDec; +var data : array[1..5] of extended; +begin + + data[1]:=DiggAddrEdit.Value; + data[2]:=AnaStart.Value; + data[3]:=AnaLen.Value; + data[4]:=DigiStart.Value; + data[5]:=DigiLen.Value; + + if DecLab.Checked then + begin + DiggAddrEdit.ValueType:=vtInteger; + AnaStart.ValueType:=vtInteger; + AnaLen.ValueType:=vtInteger; + DigiStart.ValueType:=vtInteger; + DigiLen.ValueType:=vtInteger; + AdreLaba.Caption:='Adres.DEC'; + DataLaba.Caption:='Data.DEC'; + + AnaStartLaba.Caption:='Начало анал. DEC'; + AnaLenLaba.Caption:='Длина анал. DEC'; + DigiStartLaba.Caption:='Начало дискр. DEC'; + DigiLenLaba.Caption:='Длина дискр. DEC'; + + AnaStart24.Caption:='24'; + AnaStart64.Caption:='64'; + AnaLen64.Caption :='64'; + DigiLen24.Caption :='24'; + DigiLen32.Caption :='32'; + end; + + if HexLab.Checked then + begin + DiggAddrEdit.ValueType:=vtHex; + AnaStart.ValueType:=vtHex; + AnaLen.ValueType:=vtHex; + DigiStart.ValueType:=vtHex; + DigiLen.ValueType:=vtHex; + AdreLaba.Caption:='Adres.HEX'; + DataLaba.Caption:='Data.DEC'; + + AnaStartLaba.Caption:='Начало анал. HEX'; + AnaLenLaba.Caption:='Длина анал. HEX'; + DigiStartLaba.Caption:='Начало дискр. HEX'; + DigiLenLaba.Caption:='Длина дискр. HEX'; + + AnaStart24.Caption:='18'; + AnaStart64.Caption:='40'; + AnaLen64.Caption :='40'; + DigiLen24.Caption :='18'; + DigiLen32.Caption :='20'; + end; + + DiggAddrEdit.Value :=data[1]; + AnaStart.Value :=data[2]; + AnaLen.Value :=data[3]; + DigiStart.Value :=data[4]; + DigiLen.Value :=data[5]; + +end; + +procedure TModbusForm.DecLabClick(Sender: TObject); +begin + DigiLabWrite; + AnaLabWrite; + HexaDec; +end; + +procedure TModbusForm.HexLabClick(Sender: TObject); +begin + DigiLabWrite; + AnaLabWrite; + HexaDec; +end; + +procedure TModbusForm.AnaValue(Sender: TObject); +var i, donde, cuanto : integer; +begin + donde := (Sender as TPanel).Tag; + donde := donde + AnalogStart; + DiggAddrEdit.Value := donde; + + for i:=0 to 3 do + begin + cuanto := Unites[donde+i].Data; + DataGrid.Cells[0,i]:=inttostr(cuanto); + if i = BitGroup.Tag then DigiBoxWrite(cuanto); + end; +end; + +procedure TModbusForm.DigValue(Sender: TObject); +var i, tab, one : integer; +wordai: word; +begin + tab := (Sender as TPanel).Tag; + tab := tab div 16; + one := 1; + + DiggAddrEdit.Value := Digistart.value + tab; + + for i:=3 downto 0 do + begin + wordai := Unites[DigitalStart + tab+i].Data; + DataGrid.Cells[0,i]:=inttostr(wordai); + if i = BitGroup.Tag then DigiBoxWrite(wordai); + end; +end; + +procedure TModbusForm.AnaStart24Click(Sender: TObject); +begin + AnaStart.Value:=24; +end; + +procedure TModbusForm.AnaStart64Click(Sender: TObject); +begin + AnaStart.Value:=64; +end; + +procedure TModbusForm.AnaLen64Click(Sender: TObject); +begin + AnaLen.Value:=64; +end; + +procedure TModbusForm.DigiStart0Click(Sender: TObject); +begin + DigiStart.Value:=0; +end; + +procedure TModbusForm.DigiLen24Click(Sender: TObject); +begin + DigiLen.Value:=24; +end; + +procedure TModbusForm.DigiLen32Click(Sender: TObject); +begin + DigiLen.Value:=32; +end; + +procedure TModbusForm.Renamed(Sender: TObject); +begin + NameEdit.Hide; +end; + +procedure TModbusForm.Renamido(Sender: TObject; var Key: Char); +var num: integer; +begin + if(Key = chr($D)) then // Enter + begin + num := (Sender as TEdit).Tag; + DigiBut[num].Caption:=NameEdit.Text; + DigiBut[num].SetFocus; + Project.DigiButNames[num]:= NameEdit.Text; + Project.DigiButNameChange := true; + end; + + if(Key = chr($1B)) then // ESC + begin + DigiBut[(Sender as TEdit).Tag].SetFocus; + end; +end; + +procedure TModbusForm.RenameButton(Sender: TObject; MousePos: TPoint; + var Handled: Boolean); +var i: integer; +begin + NameEdit.show; + NameEdit.Parent:=GroupBox1; + NameEdit.BorderStyle:= bsNone; + NameEdit.Text:= (Sender as TButton).Caption; + NameEdit.Top:= (Sender as TButton).Top+3; + NameEdit.Left:=(Sender as TButton).Left+4; + NameEdit.Width:=(Sender as TButton).Width-6; + NameEdit.Height:=(Sender as TButton).Height-6; + NameEdit.Tag := (Sender as TButton).Tag; + NameEdit.OnExit := Renamed; + NameEdit.OnKeyPress := Renamido; + NameEdit.setfocus; +end; + +procedure TModbusForm.ReceiveCanData(Mess: TMessag); +var + Ananum, Diginum, Boxnum: integer; + i, j, byte: integer; +begin + kownt:=kownt+1; + Memo1.Lines[0] := inttohex (mess.addr,2)+' '+ + inttohex (word(mess.data[0]),4)+' '+ + inttohex (word(mess.data[1]),4)+' '+ + inttohex (word(mess.data[2]),4)+' - '+inttostr(kownt); + + Ananum := mess.Addr - AnalogStart; + Diginum := mess.Addr - DigitalStart; + + for i:= 0 to mess.Leng-1 do + begin + if (((mess.Mask and (4 shr i))>0) + or ( mess.Leng=4)) + and( mess.Addr+i < 128) + then + begin + Unites[mess.Addr+i].Data := mess.Data[i]; + Unites[mess.Addr+i].Age := reColor; + Unites[mess.Addr+i].Surs := mess.Surs; + if (Ananum>=0) and (Ananum=0) and (Diginum 0 + then digipan[Box].color:= clRedGradient[age] + else digipan[Box].color:= clGreenGradient[age][Surs]; + Byte := byte div 2 + end +end; + +procedure TModbusForm.DigiRewrite; +var + i, j: integer; +begin + for i:= 0 to 31 do + if i < DigitalLength then + DigiColWrite(Unites[DigitalStart+i].Data,i,Unites[DigitalStart+i].Age,Unites[DigitalStart+i].Surs) + else + for j:=0 to 15 do digipan[i*16+j].color := clSilver; +end; + +procedure TModbusForm.DataLenEditChange(Sender: TObject); +var NewLen,i: integer; +begin + NewLen:= Trunc(DataLenEdit.Value); + EmptyCell:= Datagrid.Selection; + if EmptyCell.Top > NewLen + then EmptyCell.Top := NewLen; + if EmptyCell.Bottom > NewLen + then EmptyCell.Bottom := NewLen; + Datagrid.Selection:=EmptyCell; + DataGrid.RowCount:= Trunc(DataLenEdit.Value); + + if BitGroup.Tag > NewLen-1 then + BitBut[NewLen-1].Checked:=true; + + for i:=3 downto 0 do + begin + BitBut[i].Enabled:= (i <= NewLen-1); + BitBut[i].Visible:= (i <= NewLen-1); + end; +end; + +procedure TModbusForm.DataGridKeyPress(Sender: TObject; var Key: Char); +begin +case Key of + chr(3),chr(8),chr(22),'0' .. '9': ; // цифры + else + Key := Chr(0); // символ не отображать + end; +end; + +procedure TModbusForm.DataGridSetEditText(Sender: TObject; ACol, + ARow: Integer; const Value: String); +var str: string; + num: integer; +begin + + str:= Value; + + if str='' then + begin + num:=0; str:='0'; + DataGrid.Cells[ACol,ARow]:=str; + TGridCracker(DataGrid).InplaceEditor.Deselect; + end; + + if (length(str)>1) and (copy(str,1,1)='0') then + begin + delete(str,1,1); + DataGrid.Cells[ACol,ARow]:=str; + TGridCracker(DataGrid).InplaceEditor.Deselect; + end; + + try num := strtoint(str); + except + num:=0; str:='0'; + DataGrid.Cells[ACol,ARow]:=str; + TGridCracker(DataGrid).InplaceEditor.Deselect; + end; + + if num > $FFFF then + begin + delete(str,length(str),1); + DataGrid.Cells[ACol,ARow]:=str; + TGridCracker(DataGrid).InplaceEditor.Deselect; + end; + + DigiBoxWrite(num); + +end; + +procedure TModbusForm.DataGridDrawCell(Sender: TObject; ACol, + ARow: Integer; Rect: TRect; State: TGridDrawState); +begin + DataGrid.Canvas.Brush.Color:=clWindow; + DataGrid.Canvas.Font.Color := clWindowText; + DataGrid.Canvas.FillRect(Rect); + DataGrid.Canvas.TextOut(Rect.Left+2, Rect.Top+2, DataGrid.Cells[ACol, ARow]); +end; + +procedure TModbusForm.BitButClick(Sender: TObject); +var + i,key,val,sel: integer; +begin + + sel:= (Sender as TRadioButton).Tag; + if sel <> BitGroup.Tag then + begin + BitGroup.Tag:=sel; + TGridCracker(DataGrid).SelectCell(0,sel); + end; + + DigiBoxWrite(strtoint(DataGrid.Cells[0,sel])); + +end; + +procedure TModbusForm.DataGridSelectCell(Sender: TObject; ACol, + ARow: Integer; var CanSelect: Boolean); +begin + if BitGroup.Tag<>ARow then + begin + BitGroup.Tag:=ARow; + BitBut[ARow].Checked:=true; + end; +end; + +procedure TModbusForm.DoNothing(Sender: TObject); +begin +// DOES NOTHING +end; + +procedure TModbusForm.HagaNada(Sender: TObject; ACol, + ARow: Integer; var CanSelect: Boolean); +begin +// DOES NOTHING +end; + +procedure TModbusForm.DataGridGetEditText(Sender: TObject; ACol, + ARow: Integer; var Value: String); +begin + if BitGroup.Tag<>ARow then + begin + BitGroup.Tag:=ARow; + BitBut[ARow].Checked:=true; + end; +end; + +procedure TModbusForm.DigiBoxWrite(Surs: integer); +var + i,key: integer; +begin + key:=1; + for i:=0 to 15 do + begin + DigiBox[i].OnClick:= DoNothing; + DigiBox[i].Checked:= (Surs and key) >0; + DigiBox[i].OnClick:=DigiClick; + key:=key*2; + end; +end; + + + +procedure TModbusForm.AutoTimeEditChange(Sender: TObject); +begin + if trunc(AutoTimeEdit.Value) = 0 + then AutoBox.Checked:= false; + + AutoBox.Tag:= trunc(AutoTimeEdit.Value); + +end; + +end. diff --git a/slcan.dcu b/slcan.dcu new file mode 100644 index 0000000..c44ab30 Binary files /dev/null and b/slcan.dcu differ diff --git a/slcan.dll b/slcan.dll new file mode 100644 index 0000000..4f22db3 Binary files /dev/null and b/slcan.dll differ diff --git a/slcan.pas b/slcan.pas new file mode 100644 index 0000000..d338d22 --- /dev/null +++ b/slcan.pas @@ -0,0 +1,546 @@ +unit slcan; + +interface + +uses Windows; + +const + SLCAN_PROPERTY_INDEX_LINKNAME = 0; + SLCAN_PROPERTY_INDEX_INSTANCEID = 1; + SLCAN_PROPERTY_INDEX_DEVICEDESC = 2; + SLCAN_PROPERTY_INDEX_FRIENDLYNAME = 3; + SLCAN_PROPERTY_INDEX_PHOBJECTNAME = 4; + SLCAN_PROPERTY_INDEX_MFG = 5; + SLCAN_PROPERTY_INDEX_LOCATIONINFO = 6; + SLCAN_PROPERTY_INDEX_ENUMERATOR = 7; + SLCAN_PROPERTY_INDEX_CLASS = 8; + SLCAN_PROPERTY_INDEX_CLASSGUID = 9; + SLCAN_PROPERTY_INDEX_SERVICE = 10; + SLCAN_PROPERTY_INDEX_DRIVER = 11; + SLCAN_PROPERTY_INDEX_PORTNAME = 12; + SLCAN_PROPERTY_INDEX_PRODUCT = 13; + SLCAN_PROPERTY_INDEX_MANUFACTURER = 14; + SLCAN_PROPERTY_INDEX_CONFIGURATION = 15; + SLCAN_PROPERTY_INDEX_INTERFACE = 16; + SLCAN_PROPERTY_INDEX_SERIAL = 17; + SLCAN_PROPERTY_INDEX_ALIAS = 18; + SLCAN_PROPERTY_INDEX_CHANNELLINK = 19; + SLCAN_PROPERTY_INDEX_SERIALID = 20; + + SLCAN_MODE_CONFIG = $00; + SLCAN_MODE_NORMAL = $01; + SLCAN_MODE_LISTENONLY = $02; + SLCAN_MODE_LOOPBACK = $03; + SLCAN_MODE_SLEEP = $04; + + SLCAN_BR_CIA_1000K = $8000; + SLCAN_BR_CIA_800K = $8001; + SLCAN_BR_CIA_500K = $8002; + SLCAN_BR_CIA_250K = $8003; + SLCAN_BR_CIA_125K = $8004; + SLCAN_BR_CIA_50K = $8005; + SLCAN_BR_CIA_20K = $8006; + SLCAN_BR_CIA_10K = $8007; + SLCAN_BR_400K = $8008; + SLCAN_BR_200K = $8009; + SLCAN_BR_100K = $800A; + SLCAN_BR_83333 = $800B; + SLCAN_BR_33333 = $800C; + SLCAN_BR_25K = $800D; + SLCAN_BR_5K = $800E; + SLCAN_BR_30K = $800F; + SLCAN_BR_300K = $8010; + SLCAN_BR_LASTINDEX = SLCAN_BR_33333; + + SLCAN_CAP_MODE_NORMAL = $01; + SLCAN_CAP_MODE_LISTEN_ONLY = $02; + SLCAN_CAP_MODE_LOOP_BACK = $04; + SLCAN_CAP_MODE_SLEEP = $08; + + SLCAN_CAP_TXMODE_ONE_SHOT = $01; + SLCAN_CAP_TXMODE_TIME_STAMP = $02; + + SLCAN_CAP_CONTR_EXTERNAL = $00; + SLCAN_CAP_CONTR_MCP2515 = $01; + SLCAN_CAP_CONTR_SJA1000 = $02; + + SLCAN_CAP_CONTR_INTERNAL = $80; + SLCAN_CAP_CONTR_LPC = $81; + SLCAN_CAP_CONTR_STM32 = $82; + SLCAN_CAP_CONTR_STM8 = $83; + SLCAN_CAP_CONTR_PIC = $84; + SLCAN_CAP_CONTR_PIC_ECAN = $85; + + SLCAN_CAP_PHYS_HS = $01; + SLCAN_CAP_PHYS_LS = $02; + SLCAN_CAP_PHYS_SW = $04; + SLCAN_CAP_PHYS_J1708 = $08; + SLCAN_CAP_PHYS_LIN = $10; + SLCAN_CAP_PHYS_KLINE = $20; + + SLCAN_CAP_PHYS_LOAD = $01; + + SLCAN_CAP_BITRATE_INDEX = $01; + SLCAN_CAP_BITRATE_CUSTOM = $02; + SLCAN_CAP_BITRATE_AUTO = $04; + + SLCAN_EVT_LEVEL_RX_MSG = 0; + SLCAN_EVT_LEVEL_TIME_STAMP = 1; + SLCAN_EVT_LEVEL_TX_MSG = 2; + SLCAN_EVT_LEVEL_BUS_STATE = 3; + SLCAN_EVT_LEVEL_COUNTS = 4; + SLCAN_EVT_LEVEL_ERRORS = 5; + + SLCAN_EVT_TYPE_RX = $0; + SLCAN_EVT_TYPE_START_TX = $1; + SLCAN_EVT_TYPE_END_TX = $2; + SLCAN_EVT_TYPE_ABORT_TX = $3; + SLCAN_EVT_TYPE_BUS_STATE = $4; + SLCAN_EVT_TYPE_ERROR_COUNTS = $5; + SLCAN_EVT_TYPE_BUS_ERROR = $6; + SLCAN_EVT_TYPE_ARBITRATION = $7; + SLCAN_EVT_TYPE_STAMP_INC = $F; + + SLCAN_BUS_STATE_ERROR_ACTIVE = $00; + SLCAN_BUS_STATE_ERROR_ACTIVE_WARN = $01; + SLCAN_BUS_STATE_ERROR_PASSIVE = $02; + SLCAN_BUS_STATE_BUSOFF = $03; + + SLCAN_MES_INFO_EXT = $01; + SLCAN_MES_INFO_RTR = $02; + SLCAN_MES_INFO_ONESHOT = $04; + + SLCAN_DEVOP_CREATE = $00000000; + SLCAN_DEVOP_CREATEHANDLE = $00000001; + SLCAN_DEVOP_OPEN = $00000002; + SLCAN_DEVOP_CLOSE = $00000003; + SLCAN_DEVOP_DESTROYHANDLE = $00000004; + SLCAN_DEVOP_DESTROY = $00000005; + SLCAN_DEVOP_INFO = $00000006; + SLCAN_DEVOP_USER = $00000007; + + SLCAN_INVALID_HANDLE_ERROR = $E0001001; + SLCAN_DEVICE_INVALID_HANDLE_ERROR = $E0001120; + SLCAN_HANDLE_INIT_ERROR = $E0001017; + SLCAN_DEVICE_NOTOPEN_ERROR = $E0001121; + + SLCAN_EVT_ERR_TYPE_BIT = $00; + SLCAN_EVT_ERR_TYPE_FORM = $01; + SLCAN_EVT_ERR_TYPE_STUFF = $02; + SLCAN_EVT_ERR_TYPE_OTHER = $03; + + SLCAN_EVT_ERR_DIR_TX = $00; + SLCAN_EVT_ERR_DIR_RX = $01; + + SLCAN_EVT_ERR_FRAME_SOF = $03; + SLCAN_EVT_ERR_FRAME_ID28_ID21 = $02; + SLCAN_EVT_ERR_FRAME_ID20_ID18 = $06; + SLCAN_EVT_ERR_FRAME_SRTR = $04; + SLCAN_EVT_ERR_FRAME_IDE = $05; + SLCAN_EVT_ERR_FRAME_ID17_ID13 = $07; + SLCAN_EVT_ERR_FRAME_ID12_ID5 = $0F; + SLCAN_EVT_ERR_FRAME_ID4_ID0 = $0E; + SLCAN_EVT_ERR_FRAME_RTR = $0C; + SLCAN_EVT_ERR_FRAME_RSRV0 = $0D; + SLCAN_EVT_ERR_FRAME_RSRV1 = $09; + SLCAN_EVT_ERR_FRAME_DLC = $0B; + SLCAN_EVT_ERR_FRAME_DATA = $0A; + SLCAN_EVT_ERR_FRAME_CRC_SEQ = $08; + SLCAN_EVT_ERR_FRAME_CRC_DEL = $18; + SLCAN_EVT_ERR_FRAME_ACK_SLOT = $19; + SLCAN_EVT_ERR_FRAME_ACK_DEL = $1B; + SLCAN_EVT_ERR_FRAME_EOF = $1A; + SLCAN_EVT_ERR_FRAME_INTER = $12; + SLCAN_EVT_ERR_FRAME_AER_FLAG = $11; + SLCAN_EVT_ERR_FRAME_PER_FLAG = $16; + SLCAN_EVT_ERR_FRAME_TDB = $13; + SLCAN_EVT_ERR_FRAME_ERR_DEL = $17; + SLCAN_EVT_ERR_FRAME_OVER_FLAG = $1C; + + SLCAN_TX_STATUS_OK =$00; + SLCAN_TX_STATUS_TIMEOUT =$01; + SLCAN_TX_STATUS_BUSOFF =$02; + SLCAN_TX_STATUS_ABORT =$03; + SLCAN_TX_STATUS_NOT_ENA =$04; + SLCAN_TX_STATUS_ERROR_ONE_SHOT =$05; + SLCAN_TX_STATUS_INVALID_MODE =$06; + SLCAN_TX_STATUS_UNKNOWN =$0F; + + SLCAN_PURGE_TX_ABORT =$01; + SLCAN_PURGE_RX_ABORT =$02; + SLCAN_PURGE_TX_CLEAR =$04; + SLCAN_PURGE_RX_CLEAR =$08; + type +//{$IFDEF CompilerVersion} +//{$IF CompilerVersion >= 16 } +//TSlCanDevice = NativeUInt; +//{$ELSE} +//TSlCanDevice = longword; +//{$ENDIF} +//{$ELSE} +TSlCanDevice = longword; +//{$ENDIF} + + +PSlCanCapabilities = ^TSlCanCapabilities; +TSlCanCapabilities = packed record + bModes:byte; + bTXModes:byte; + bMaxEventLevel:byte; + bController:byte; + bPhysical:byte; + bPhysicalLoad:byte; + bBitrates:byte; + bAdvancedModes:byte; + dwCanBaseClk:longword; + dwTimeStampClk:longword; + wMaxBrp:word; +end; + +PSlCanState = ^TSlCanState; +TSlCanState = packed record + States: array [0 .. 1] of byte; + ErrCountRX:byte; + ErrCountTX:byte; +end; + +PSlCanMessage = ^TSlCanMessage; +TSlCanMessage = packed record + Info:byte; + ID:longword; + DataCount:byte; + Data: array [0 .. 7] of byte; +end; + +PSlCanTxMessage = ^TSlCanTxMessage; +TSlCanTxMessage = packed record + dwDelay:longint; + Msg:TSlCanMessage; +end; + + +PSlCanEvent = ^TSlCanEvent; +TSlCanEvent = packed record + EventType:byte; + TimeStampLo:longword; + case integer of + 0:(Msg:TSlCanMessage); + 1:(TimeStamp: array [0 .. 1] of longword); + 2:(TimeStamp64: UInt64); + 3:(BusMode:byte; + bDummy1:byte; + ErrCountRX:byte; + ErrCountTX:byte; + ErrType:byte; + ErrDir:byte; + ErrFrame:byte; + LostArbitration:byte); +end; + +PSlCanBitRate = ^TSlCanBitRate; +TSlCanBitRate = packed record + BRP:word; + TSEG1:byte; + TSEG2:byte; + SJW:byte; + SAM:byte; +end; + +PSlCanTimeStamp = ^TSlCanTimeStamp; +TSlCanTimeStamp = packed record + case integer of + 0:(Value:int64); + 1:(dwValue: array [0 .. 1] of longword); + 2:(wValue: array [0 .. 3] of word); + 3:(bValue: array [0 .. 7] of byte); +end; + +TSlCan_DeviceCallBack = procedure( + hDevice: TSlCanDevice; + dwIndex: longword; + Operation: longword; + pContext: pointer; + dwContextSize: longword + );stdcall; + +TSlCan_DeviceListCallBack = procedure( + hDevice: TSlCanDevice; + dwIndex: longword; + pContext: pointer; + dwContextSize: longword + );stdcall; + +function SlCan_Load( + DeviceProc: TSlCan_DeviceCallBack; + DeviceListProc: TSlCan_DeviceListCallBack + ):longbool;stdcall; + +function SlCan_Free( + bDoCallBack:longbool + ):longbool;stdcall; + +function SlCan_Update:longbool;stdcall; + +function SlCan_GetDeviceCount:longword;stdcall; + +function SlCan_GetDevice( + dwIndex:longword + ):TSlCanDevice;stdcall; + +function SlCan_DeviceGetHandle( + hDevice:TSlCanDevice + ):THandle;stdcall; + +function SlCan_DeviceGetProperty( + hDevice: TSlCanDevice; + dwIndex: longword; + pBuf: pAnsiChar; + dwSize: longword + ):longword;stdcall; + +function SlCan_DeviceGetPropertyW( + hDevice: TSlCanDevice; + dwIndex: longword; + pBuf: PWideChar; + dwSize: longword + ):longword;stdcall; + +function SlCan_DeviceGetRegKey( + hDevice: TSlCanDevice; + dwIndex: longword + ):HKEY;stdcall; + +function SlCan_DeviceSetContext( + hDevice:TSlCanDevice; + pBuf: pointer; + dwBufSize:longword + ):pointer;stdcall; + +function SlCan_DeviceGetContext(hDevice:TSlCanDevice):pointer;stdcall; + +function SlCan_DeviceGetContextSize( + hDevice: TSlCanDevice + ):longword;stdcall; + +function SlCan_DeviceSetAlias( + hDevice: TSlCanDevice; + pBuf: PAnsiChar + ):longbool;stdcall; + +function SlCan_DeviceGetAlias( + hDevice:TSlCanDevice; + pBuf: PAnsiChar; + dwSize: longword + ):longword;stdcall; + +function SlCan_DeviceSetAliasW( + hDevice: TSlCanDevice; + pBuf: PWideChar + ):longbool;stdcall; + +function SlCan_DeviceGetAliasW( + hDevice: TSlCanDevice; + pBuf: PWideChar; + dwSize: longword + ):longword;stdcall; + +function SlCan_DeviceGetCapabilities( + hDevice: TSlCanDevice; + pCap: PSlCanCapabilities + ):longbool;stdcall; + +function SlCan_DeviceOpen( + hDevice:TSlCanDevice + ):longbool;stdcall; + +function SlCan_DeviceClose( + hDevice:TSlCanDevice + ):longbool;stdcall; + +function SlCan_DeviceSetMode( + hDevice: TSlCanDevice; + dwMode: longword + ):longbool;stdcall; + +function SlCan_DeviceGetMode( + hDevice: TSlCanDevice; + pdwMode: Plongword + ):longbool;stdcall; + +function SlCan_DeviceGetState( + hDevice:TSlCanDevice; + pState: PSlCanState + ):longbool;stdcall; + +function SlCan_DeviceSetTXTimeOut( + hDevice: TSlCanDevice; + dwValue: longword):longbool;stdcall; + +function SlCan_DeviceGetTXTimeOut( + hDevice: TSlCanDevice; + pdwValue:Plongword + ):longbool;stdcall; + +function SlCan_DeviceGetBitRate( + hDevice: TSlCanDevice; + pBitRate:PSlCanBitRate + ):longbool;stdcall; + +function SlCan_DeviceSetBitRate( + hDevice: TSlCanDevice; + pBitRate:PSlCanBitRate + ):longbool;stdcall; + +function SlCan_DeviceEnaRec( + hDevice: TSlCanDevice; + bValue: byte + ):longbool;stdcall; + +function SlCan_DeviceSetLatency( + hDevice: TSlCanDevice; + bValue: byte + ):longbool;stdcall; + +function SlCan_DeviceGetLatency( + hDevice: TSlCanDevice; + pbValue: pbyte + ):longbool;stdcall; + +function SlCan_DevicePurge( + hDevice:TSlCanDevice; + bValue: byte + ):longbool;stdcall; + +function SlCan_DeviceSetEventLevel( + hDevice:TSlCanDevice; + bValue: byte + ):longbool;stdcall; + +function SlCan_DeviceGetEventLevel( + hDevice:TSlCanDevice; + pbValue: pbyte + ):longbool;stdcall; + +function SlCan_DeviceSetStartTimeStamp( + hDevice: TSlCanDevice; + pValue: PSlCanTimeStamp + ):longbool;stdcall; + +function SlCan_DeviceGetStartTimeStamp( + hDevice: TSlCanDevice; + pValue: PSlCanTimeStamp + ):longbool;stdcall; + +function SlCan_DeviceGetTimeStamp( + hDevice: TSlCanDevice; + pValue: PSlCanTimeStamp + ):longbool;stdcall; + +function SlCan_DeviceSetTimeStampPeriod( + hDevice: TSlCanDevice; + lValue: longint + ):longbool;stdcall; + +function SlCan_DeviceGetTimeStampPeriod( + hDevice: TSlCanDevice; + plValue: PLongint + ):longbool;stdcall; + +function SlCan_DeviceSetExMode( + hDevice: TSlCanDevice; + bMode: byte + ):longbool;stdcall; + +function SlCan_DeviceGetExMode( + hDevice:TSlCanDevice; + pbMode: pbyte + ):longbool;stdcall; + + +function SlCan_DeviceWriteMessages( + hDevice: TSlCanDevice; + pMsg: PSlCanMessage; + Count: longword; + pStatus: pbyte + ):longbool;stdcall; + +function SlCan_DeviceWriteMessagesEx( + hDevice: TSlCanDevice; + pMsg: PSlCanTxMessage; + Count: longword; + pStatus: pbyte; + pdwCount:Plongword + ):longbool;stdcall; + +function SlCan_DeviceReadMessages( + hDevice: TSlCanDevice; + dwTimeOut:longword; + pMsg: PSlCanMessage; + Count: longword; + pCount: Plongword + ):longbool;stdcall; + +function SlCan_DeviceReadEvents( + hDevice: TSlCanDevice; + dwTimeOut:longword; + pEvent: PSlCanEvent; + Count: longword; + pCount: Plongword + ):longbool;stdcall; + +implementation + +const + Dll = 'slcan.dll'; + +function SlCan_Load;stdcall;external Dll; +function SlCan_Free;stdcall;external Dll; +function SlCan_Update;stdcall;external Dll; +function SlCan_GetDeviceCount;stdcall;external Dll; +function SlCan_GetDevice;stdcall;external Dll; + +function SlCan_DeviceGetHandle;stdcall;external Dll; +function SlCan_DeviceOpen;stdcall;external Dll; +function SlCan_DeviceClose;stdcall;external Dll; + +function SlCan_DeviceGetProperty;stdcall;external Dll; +function SlCan_DeviceGetPropertyW;stdcall;external Dll; +function SlCan_DeviceGetRegKey;stdcall;external Dll; +function SlCan_DeviceSetAlias;stdcall;external Dll; +function SlCan_DeviceGetAlias;stdcall;external Dll; +function SlCan_DeviceSetAliasW;stdcall;external Dll; +function SlCan_DeviceGetAliasW;stdcall;external Dll; +function SlCan_DeviceGetCapabilities;stdcall;external Dll; + +function SlCan_DeviceSetContext;stdcall;external Dll; +function SlCan_DeviceGetContext;stdcall;external Dll; +function SlCan_DeviceGetContextSize;stdcall;external Dll; + +function SlCan_DeviceSetMode;stdcall;external Dll; +function SlCan_DeviceGetMode;stdcall;external Dll; +function SlCan_DeviceGetState;stdcall;external Dll; +function SlCan_DeviceSetTXTimeOut;stdcall;external Dll; +function SlCan_DeviceGetTXTimeOut;stdcall;external Dll; + +function SlCan_DeviceGetBitRate;stdcall;external Dll; +function SlCan_DeviceSetBitRate;stdcall;external Dll; +function SlCan_DeviceEnaRec;stdcall;external Dll; +function SlCan_DeviceSetLatency;stdcall;external Dll; +function SlCan_DeviceGetLatency;stdcall;external Dll; +function SlCan_DevicePurge;stdcall;external Dll; +function SlCan_DeviceSetEventLevel;stdcall;external Dll; +function SlCan_DeviceGetEventLevel;stdcall;external Dll; +function SlCan_DeviceSetStartTimeStamp;stdcall;external Dll; +function SlCan_DeviceGetStartTimeStamp;stdcall;external Dll; +function SlCan_DeviceGetTimeStamp;stdcall;external Dll; +function SlCan_DeviceSetTimeStampPeriod;stdcall;external Dll; +function SlCan_DeviceGetTimeStampPeriod;stdcall;external Dll; +function SlCan_DeviceSetExMode;stdcall;external Dll; +function SlCan_DeviceGetExMode;stdcall;external Dll; + +function SlCan_DeviceWriteMessages;stdcall;external Dll; +function SlCan_DeviceWriteMessagesEx;stdcall;external Dll; +function SlCan_DeviceReadMessages;stdcall;external Dll; +function SlCan_DeviceReadEvents;stdcall;external Dll; + +end. diff --git a/white_hero.ico b/white_hero.ico new file mode 100644 index 0000000..66f0ad3 Binary files /dev/null and b/white_hero.ico differ