Någon som har ett förslag på hur man kan göra följande kod kortare? Hej sen kan du bara sätta dom i en loop eler for slinga så blir det fin fint Hej Sven. Tror jag vet vad du menar... ska testa att skriva ett exempl. Nej tyvärr jag vete f*n hur man ska bära sig åt om man inte kan göra MW till array... vore mycket lättare. Hej igen Hej... Hej Om detta inlägg gäller VB så har jag lite fråger. För er andra så kommer koden här i ett nerbantat format... Hej igen Om det gäller att skicka och ta emot data från PLC:er brukar OPC vara det som gäller. Du har inga sådana här problem där. Jo, Jag har en OPC-server som lanseras av Schnieder Electric som heter ÓFS som sedan kommunicerar med ett Scada-system som heter VijeoLook och i VijeoLook finns VBA. Men jag kan inte kommunicera med PLC'n via arrayer utan endast via enskilda register. Jag kan inte svära på detta men det verkar vara så iaf... Så det är nog dött lopp... Hej,Korta ner koden...
Tanken är att föra över arrayen ut på enskilda variabler.
MW0 osv är fasta variabler som ej kan göras om till en array...
Public MW0, MW1, MW2... MW100 As Long
Dim arrData(0 to 100) As Long
MW0 = arrData(0)
MW1 = arrData(1)
MW2 = arrData(2)
...
MW100 = arrData(100)
End Sub
Mvh FrasseSv: Korta ner koden...
En fråga som du inte gillar , men varför i hela fridens namn
skall man göra det ??. Synpunkter
Public MW0, MW1, MW2, MW100 As Long
Nu är det bara MW100 som blir As Long de övriga blir Variant.
Dim arrData(0 to 100) As Long .kan skrivas
Dim arrData(100) As Long
Du jar ju 100 enkilda variable. Döp om arrayen till MW(100)
nu kan du plocka de enskilda värdena med
tex. MsgBox MW(63)
Skulle inte det funka ??
undra mvh
SvenSv: Korta ner koden...
Dim nummer as integer
nummer=0
Do until nummer>100
MW(nummer)=arrData(nummer)
nummer=nummer+1
Loop
gör du som ovan så blir MW(**) den motsvarande på arrData(**), mycket praktiskt.
Morron kodning... mums! // R-musSv: Korta ner koden...
Jo mitt problem är som sagt att MW0 t.o.m MW100 är 16-bitars register i ett PLC. Dessa register i PLC'n kan jag inte behandla som array utan endast som enskilda variabler. Jag valde att skriva mitt program baserat på arrayer och det fungerar alldeles utmärkt förutom då jag ska läsa eller skriva arrayen mot PLC. Och den enda metod som jag har kommit på är att flytta varje register för sig som jag har gjort nedan:
Det hade varit bra om man hade kunnat hitta på något som hade räknat upp min MW-variabel utan att göra den till en array...
'För över arrayen till register i PLC´n
MW0 = arrReg(0)
MW1 = arrReg(1)
MW2 = arrReg(2)
MW3 = arrReg(3)
MW4 = arrReg(4)
MW5 = arrReg(5)
MW6 = arrReg(6)
MW7 = arrReg(7)
MW8 = arrReg(8)
MW9 = arrReg(9)
MW10 = arrReg(10)
MW11 = arrReg(11)
MW12 = arrReg(12)
MW13 = arrReg(13)
MW14 = arrReg(14)
MW15 = arrReg(15)
MW16 = arrReg(16)
MW17 = arrReg(17)
MW18 = arrReg(18)
MW19 = arrReg(19)
MW20 = arrReg(20)
MW21 = arrReg(21)
MW22 = arrReg(22)
MW23 = arrReg(23)
MW24 = arrReg(24)
MW25 = arrReg(25)
MW26 = arrReg(26)
MW27 = arrReg(27)
MW28 = arrReg(28)
MW29 = arrReg(29)
MW30 = arrReg(30)
osv...
Mvh FrasseSv: Korta ner koden...
BRB // R-musSv: Korta ner koden...
Får se om nån annan kan lösa det // R-musSv: Korta ner koden...
Okidoki nu förstår jag.
Du kan använda denna kod för att läsa in i en txtfil
Sedan klistrar du in texten på resp plats.
DefLng M gör att alla variabler som börjar på M
med automatik blir Long.
Det ser tokigt ut i subarna men det gör väl inte så mycket
det kommer att funka snabbt och bra.
mvh
Sven
Option Explicit
DefLng M
Private Sub Command1_Click()
Dim FileNum As Long, i As Long
FileNum = FreeFile
Open "C:\vbkod.txt" For Output As #FileNum
Print #FileNum, "Option Explicit"
Print #FileNum, "DefLng M"
For i = 0 To 100
Print #FileNum, "Public "; "MW"; CStr(i)
Next i
Print #FileNum, "Public "; "MarrReg(100)"
Print #FileNum, ""
For i = 0 To 100
Print #FileNum, "MW"; CStr(i); " = MarrReg("; CStr(i); ")"
Next i
Close #FileNum
End Sub
DSSv: Korta ner koden...
Nu måste jag hacka på SvenPon, men det jag skall hacka om kanske är
fel, då jag tar detta ur minnet utan att kontrollera. Så JA jag är beredd på
att få pajkastning tillbaka.
>Dim arrData(0 to 100) As Long .kan skrivas
>Dim arrData(100) As Long
Har för mig att Dim arrData skapar en array från 1 till 100 och inte 0 till 100.
Arrayen 0-100 får man om man explicit skriver Option Base 0 Annars
är det Option Base 1 som är default.
För övrigt vill jag som luttrad C-programmerare påpeka att 0-100 är
101 index. I C deklarerar man arrayer från index 0 och framåt och detta
gör alltid saker mycket tydligare och lättare att förstå.
/[peter.h]Sv: Korta ner koden...
Nej du har fel. Arrayer börjar default på 0. Option Base 1
bör vi glömma bara strul.
Du har en poäng på 100. Dvs det kommer att bli 101 fack.
Jag brukar bjuda på fack 0 om jag behöver börja på 1
Annrs så får du hacka hur mycket du vill.
>I C deklarerar man arrayer från index 0 och framåt och detta
gör alltid saker mycket tydligare och lättare att förstå.
>"mycket tydligare och lättare att förstå."
Helt och hållet en kapacitetsfråga. tex så finns det vissa
här som inte kan acceptera att Enter har KeyAscii 13
det blir för svårt när det handlar om siffror. :-)
mvh
SvenSv: Korta ner koden...
* Har du deklarerat de globala variablerna MW0...MW100?
* Måste du använda dessa. Är det en dll eller modul som du skickar dem till?
* Kan du skicka med lite mer av din kod. Så ve ser hur du använder variablerna.Sv: Korta ner koden...
Option Explicit
'Deklarera alla 16-bitars PLC'registrerna
Public MW0, MW1, MW2, MW3, MW4, MW5, MW6, MW7, MW8, MW9, MW10, MW11, MW12, MW13, MW14, MW15, MW16, MW17, MW18, MW19, MW20, MW21, MW22, MW23, MW24, MW25, MW26, MW27, MW28, MW29, MW30, MW31, MW32, MW33, MW34, MW35, MW36, MW37, MW38, MW39, MW40, MW41, MW42, MW43, MW44, MW45, MW46, MW47, MW48, MW49 As Long
Public MW50, MW51, MW52, MW53, MW54, MW55, MW56, MW57, MW58, MW59, MW60, MW61, MW62, MW63, MW64, MW65, MW66, MW67, MW68, MW69, MW70, MW71, MW72, MW73, MW74, MW75, MW76, MW77, MW78, MW79, MW80, MW81, MW82, MW83, MW84, MW85, MW86, MW87, MW88, MW89, MW90, MW91, MW92, MW93, MW94, MW95, MW96, MW97, MW98, MW99 As Long
Public MW100, MW101, MW102, MW103, MW104, MW105, MW106, MW107, MW108, MW109, MW110, MW111, MW112, MW113, MW114, MW115, MW116, MW117, MW118, MW119, MW120, MW121, MW122, MW123, MW124, MW125, MW126, MW127 As Long
'Gemensam Subrutin för att omvandla en sträng tecken, max 254st, till 16-bitars Register
Private Sub SkrivTillPlcReg()
'Deklarera variabler
Dim Reg16Bit As Long
Dim arrReg(0 To 127) As Long
Dim Asci1, Asci2, AntIStr As Byte
Dim x, w As Integer
'Om det finns något i rutan så utför beräkningen
If txtExport.Text <> "" Then
'Ta reda på hur lång texten är
AntIStr = Len(txtExport.Text)
'Om antalet är ojämnt lägg till ett tecken sist i strängen för att få den jämn
If AntIStr Mod 2 <> 0 Then
txtExport.Text = txtExport.Text & Chr(160)
End If
'Uppdaterar antalet tecken i strängen
AntIStr = Len(txtExport.Text)
'Skriv in i första registret hur många par tecken strängen består av
arrReg(0) = (AntIStr / 2)
'Plocka ut två tecken ur strängen i taget
For x = 1 To (AntIStr - 1) Step 2
'Nollställ det temporära registret Reg16Bit
Reg16Bit = 0
'Tilldela Asci1 och Asci2 värdet för Tecken 1 och Tecken 2
Asci1 = Asc(Mid(txtExport.Text, x, 1))
Asci2 = Asc(Mid(txtExport.Text, x + 1, 1))
'Lägg ut två tecken i varje 16-bitars arrReg
For w = 0 To 7
'Utmaskning av bit från första tecknet jämför sedan
If (Asci1 And 2 ^ w) = 2 ^ w Then
'Om biten är ett så räkna upp Reg16Bit med bitens värde
Reg16Bit = Reg16Bit + (1 * 2 ^ w)
End If
'Utmaskning av bit från andra tecknet jämför sedan
If (Asci2 And 2 ^ w) = 2 ^ w Then
'Om biten är ett så räkna upp Reg16Bit med bitens värde
Reg16Bit = Reg16Bit + (1 * 2 ^ (w + 8))
End If
Next w
'Skriv värdet av de sammanslagna Byten till arrReg()
arrReg((x + 1) / 2) = Reg16Bit
Next x
'För över arrayen till register i PLC´n
MW0 = arrReg(0): MW1 = arrReg(1): MW2 = arrReg(2): MW3 = arrReg(3): MW4 = arrReg(4): MW5 = arrReg(5): MW6 = arrReg(6): MW7 = arrReg(7): MW8 = arrReg(8): MW9 = arrReg(9): MW10 = arrReg(10): MW11 = arrReg(11): MW12 = arrReg(12): MW13 = arrReg(13): MW14 = arrReg(14): MW15 = arrReg(15): MW16 = arrReg(16): MW17 = arrReg(17): MW18 = arrReg(18): MW19 = arrReg(19): MW20 = arrReg(20): MW21 = arrReg(21): MW22 = arrReg(22): MW23 = arrReg(23): MW24 = arrReg(24): MW25 = arrReg(25): MW26 = arrReg(26): MW27 = arrReg(27): MW28 = arrReg(28): MW29 = arrReg(29): MW30 = arrReg(30): MW31 = arrReg(31):
MW32 = arrReg(32): MW33 = arrReg(33): MW34 = arrReg(34): MW35 = arrReg(35): MW36 = arrReg(36): MW37 = arrReg(37): MW38 = arrReg(38): MW39 = arrReg(39): MW40 = arrReg(40): MW41 = arrReg(41): MW42 = arrReg(42): MW43 = arrReg(43): MW44 = arrReg(44): MW45 = arrReg(45): MW46 = arrReg(46): MW47 = arrReg(47): MW48 = arrReg(48): MW49 = arrReg(49): MW50 = arrReg(50): MW51 = arrReg(51): MW52 = arrReg(52): MW53 = arrReg(53): MW54 = arrReg(54): MW55 = arrReg(55): MW56 = arrReg(56): MW57 = arrReg(57): MW58 = arrReg(58): MW59 = arrReg(59): MW60 = arrReg(60): MW61 = arrReg(61): MW62 = arrReg(62): MW63 = arrReg(63):
MW64 = arrReg(64): MW65 = arrReg(65): MW66 = arrReg(66): MW67 = arrReg(67): MW68 = arrReg(68): MW69 = arrReg(69): MW70 = arrReg(70): MW71 = arrReg(71): MW72 = arrReg(72): MW73 = arrReg(73): MW74 = arrReg(74): MW75 = arrReg(75): MW76 = arrReg(76): MW77 = arrReg(77): MW78 = arrReg(78): MW79 = arrReg(79): MW80 = arrReg(80): MW81 = arrReg(81): MW82 = arrReg(82): MW83 = arrReg(83): MW84 = arrReg(84): MW85 = arrReg(85): MW86 = arrReg(86): MW87 = arrReg(87): MW88 = arrReg(88): MW89 = arrReg(89): MW90 = arrReg(90): MW91 = arrReg(91): MW92 = arrReg(92): MW93 = arrReg(93): MW94 = arrReg(94): MW95 = arrReg(95):
MW96 = arrReg(96): MW97 = arrReg(97): MW98 = arrReg(98): MW99 = arrReg(99): MW100 = arrReg(100): MW101 = arrReg(101): MW102 = arrReg(102): MW103 = arrReg(103): MW104 = arrReg(104): MW105 = arrReg(105): MW106 = arrReg(106): MW107 = arrReg(107): MW108 = arrReg(108): MW109 = arrReg(109): MW110 = arrReg(110): MW111 = arrReg(111): MW112 = arrReg(112): MW113 = arrReg(113): MW114 = arrReg(114): MW115 = arrReg(115): MW116 = arrReg(116): MW117 = arrReg(117): MW118 = arrReg(118): MW119 = arrReg(119): MW120 = arrReg(120): MW121 = arrReg(121): MW122 = arrReg(122): MW123 = arrReg(123): MW124 = arrReg(124): MW125 = arrReg(125): MW126 = arrReg(126): MW127 = arrReg(127):
End IfSv: Korta ner koden...
Om du tror att dina MW är av typ Long så är det fel
det är bara den sista i kedjan som blir Long
De övriga blir Variant.Sen tycker jag att det är ganska
meningslöst att svara när du ändå inte läser. Se DefLng M
Usch vilket problem.Måste gå att lösa på annat vis ?? ??
funderande
SvenSv: Korta ner koden...
Om det rör sig om en specialkontroll/dll/osv borde det fortfarande att gå att använda array och det borde vara där problemet skall lösas. Kanske bättre att beskriva hur du pratar med PLC:en (kan nog vara rätt generellt om du inte vill tala om vilken/till vad ect)Sv: Korta ner koden...
Sv: Korta ner koden...
Du kan använda den inbyggda funktionen CallByName för att anropa funktioner baserat på funktionens namn. Snyggast blir att lägga alla dessa variabler i en klass, det går bra att deklarera dom som publika variabler (fields) i st f publika properties eftersom vb internt gör om publika fält till properties. Alltså, en klass clsData :
<code>
' Här börjar klassen clsData
Public MW0 as long
Public MW1 as long
' ... o s v
' Här slutar klassen clsData
<code>
Anropa sedan variablerna med :
<code>
' Skapa en instans av clsData
Dim obData as clsData
set obData=new clsData
' För att hämta värdet i element nummer 5 :
MsgBox CallByName (obData, "MW" & Format(5), VbGet)
' För att sätta värdet i element nummer 5 till 1234 :
CallByName obData,"MW" & format(5),vbLet,1234
<code>
/Per Hultqvist