SCL中指標問題

2021-08-21 15:24:49 字數 1590 閱讀 5316

針對i、q、m可以進行百分號定址。例如

if %ix(idx := #by_1, bit := #bi_1) then

%mw(idx := #bw_1) := 100;

else

%qd(idx := #bd_1) := 99;

end_if;針對db塊也可以使用百分號進行定址。例如,

if %db1.dx(idx := #by_1, bit := #bi_1) then

%db1.dw(idx := #bw_1) := 100;

else

%db1.dd(idx := #bd_1) := 99;

end_if;

當需要對db塊的db號進行定址的時候,需要用到word_to_block_db庫函式。例如,

if word_to_block_db(#db_1).dx(idx := #by_1, bit := #bi_1) then

word_to_block_db(#db_1).dw(idx := #bw_1) := 100;

else

word_to_block_db(#db_1).dd(idx := #bd_1) := 99;

end_if;

針對i、q、m的定址使用peek和poke指令。例如

#t_bi01:= peek_bool(area:=16#81, dbnumber:=0, byteoffset:=#by_1, bitoffset:=#bi_1);

其中對於area引數即是指定訪問的位址是i、m、q、db中的哪乙個區。具體對應關係如下:

16#81:輸入

16#82:輸出

16#83:位儲存區

16#84:db

16#1:外設輸入(僅 s7-1500)

此外,需注意的是,如果area引數不是16#84的話(即非訪問db塊,則dbnumber引數需寫入0。

針對非優化的db塊的定址使用peek和poke指令。例如,

#t_bi01:= peek_bool(area:=16#81, dbnumber:=0, byteoffset:=#by_1, bitoffset:=#bi_1);

對於非優化的db塊的訪問如同對於i、q、m區域定址一樣,此處不再贅述。

針對於優化的db塊訪問,因優化的db塊無位址偏移,故無法進行指標定址。如果在程式設計過程中需要使用到連續的位址或是有規則的位址,則可以將需要定址的資料存放於陣列中,然後再對陣列的下標進行定址。

對any指標的應用

在1200的scl中無法使用any指標,但是可以在介面處使用any指標作為輸入。然後使用serialize指令將指標所指向的值轉為位元組陣列。

注意,使用serialize指令結果必須為位元組陣列,不可以是int型別或其他型別陣列。

對陣列的定址

如果是使用lad程式設計,針對於陣列的定址可以使用fieldread和fieldwrite指令。

a) 1500中的指標定址與1200基本相同,若新版本韌體出來以後,看是否有新的改動。

C 中指標形參問題

1.c 指標做形參,會有很多陷阱,很多時候也許並不如我們想的那樣。比如我們想通過乙個函式改變指標的值 include using namespace std void test point int p intmain 這段 明顯想通過函式改變p1的值,但是結果卻沒有變化,輸出仍舊是1。問題就出在關鍵...

陣列中指標p

在定義乙個整型陣列時,系統會給陣列分配乙個 資料型別 陣列長度 個位元組儲存單元 乙個整型陣列的乙個儲存單元格是四個位元組,三十二位位元,圖中乙個大的藍色格仔有四個小格仔,則第二個格仔的位址為101,第三個格仔的位址為102,第四個格仔的位址為103 例如 因為十六進製制中權重是從左到右依次減小,所...

go中指標型別

普通類行,變數存的就是值,也叫值型別 指標型別,變數存的是乙個位址,這個位址存的才是乙個值 獲取指標型別所指向的值嗎使用 比如 var p int,使用p獲取p指向的值 案列 獲取乙個變數的位址 package main import fmt func main 執行結果 50xc000080000...